提升数学效率:导航 Numpy 数组操作

举报
yd_217961358 发表于 2023/09/13 17:10:11 2023/09/13
【摘要】 在本文中,我们将发现用于数据分析的著名且有用的 Python 库之一 NumPy 的效力,其中存储元素和执行操作的主要数据结构是一个多维数组。我们将看到这个动态库如何使复杂的数学任务在空间和时间复杂度方面变得高效。此外,了解如何通过轻松操作更轻松地进行数据操作和转换
推荐:使用NSDT场景编辑器快速搭建3D应用场景

什么是 Numpy?

Numpy、Scipy 和 Matplotlib 是数据科学项目中使用的 Python 库,它们提供类似 MATLAB 的功能。

提升数学效率:导航 Numpy 数组操作


图片来自维基百科

主要是,Numpy具有以下功能:

  1. 类型化多维数组(矩阵)
  2. 快速数值计算(矩阵数学)
  3. 高级数学函数

Numpy代表Numerical Python,是高性能计算和数据分析所需的基本软件包。NumPy对于Python中的数值计算是必需的,因为它是为大型数据数组的效率而设计的。

创建 numpy 数组的不同方法

在开始对 numpy 数组进行操作之前,我们的第一个目标是熟练地根据问题陈述根据我们的要求创建 numpy 数组。

有多种方法可以创建 numpy 数组。下面提到了一些标准和实用的方法:

案例 1:使用 np.ones 方法创建数组:

如果我们必须创建一个只有“一”的数组,你可以利用这种方法。

np.ones((3,5), dtype=np.float32)
#Output
[[1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]

案例 2:使用 np.zeros 方法创建零数组:

如果我们必须创建一个只有“零”的数组,你可以使用这种方法。

np.zeros((6,2), dtype=np.int8)
# Output
[[0 0]
 [0 0]
 [0 0]
 [0 0]
 [0 0]
 [0 0]]

案例 3:使用 np.arange 方法:

如果必须按照序列创建元素数组,则可以使用此方法。

np.arange(1334,1338)
#Output
[1334 1335 1336 1337]

案例 4:使用 np.concatenate 方法:

当您所需的数组组合一个或多个数组时,此方法是正确的。

A = np.ones((2,3))
B = np.zeros((4,3))
C = np.concatenate([A, B])
#Output
[[1. 1. 1.]
 [1. 1. 1.]
 [0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]

案例 5:使用 np.random.random 方法:

在创建具有随机值的数组时,它很有用。

np.random.random((2,3))
#Output
[[0.30512345 0.10055724 0.89505387]
 [0.36219316 0.593805   0.7643694 ]]

Numpy 数组操作

让我们通过一个例子来讨论 numpy 数组的基本属性:

法典:

a = numpy.array([[1,2,3],[4,5,6]],dtype=numpy.float32)
# Array dimensions, shape, and data types
print (a.ndim, a.shape, a.dtype)
Output:
2 (2, 3) float32

基于上面的代码,我们有以下几点要记住作为结论:

  1. 数组可以将任何维度作为正整数,包括零(对应于标量值)。
  2. 数组是类型化的,可以具有数据类型,例如 np.uint8、np.int64、np.float32、np.float64
  3. 数组是密集的。数组的每个元素都存在并具有相同的类型。

法典:

# Arrays reshaping
a = numpy.array([1,2,3,4,5,6])
a = a.reshape(3,2)              
#Output: 
[[1 2]                 
[3 4]                           
[5 6]]

a = a.reshape(2,-1)
#Output: 
[[1 2 3]
 [4 5 6]]

a = a.ravel()
#Output:  
[1 2 3 4 5 6]

要记住的要点:

  1. 整形操作后,数组中的元素总数无法更改。
  2. 要推断轴形状,请使用 -1。
  3. 默认情况下,它以行主格式存储元素,而另一方面,在 MATLAB 中,它是列主格式。

数字阵列广播

广播允许对不同形状的数组执行操作,只要它们兼容。数组的较小维度实际上会扩展以匹配较大数组的维度。

提升数学效率:导航 Numpy 数组操作


图片来自Javatpoint

法典:

# arrays broadcasting
a = numpy.array([[1, 2], [3, 4], [5, 6]])
b = numpy.array([10, 20])
c = a + b  # Broadcasting the 'b' array to match the dimensions of 'a'

该示例涉及维度为 (2, 3) 的 2D NumPy 数组“a”和形状为 (1) 的一维数组“b”。广播允许操作“a + b”虚拟扩展“b”以匹配二维中的“a”,从而在“a”和扩展的“b”之间逐元素加法。

数组索引和切片

  1. 切片是视图。写入切片会覆盖原始数组。
  2. 列表或布尔数组也可以为其编制索引。
  3. Python 索引语法:

start_index : stop_index: step_size

法典:

a = list(range(10)) 

 # first 3 elements
a[:3] # indices 0, 1, 2 

# last 3 elements
a[-3:] # indices 7, 8, 9 

# indices 3, 5, 7 
a[3:8:2] 

# indices 4, 3, 2 (this one is tricky)
a[4:1:-1] 

如您所知,图像也可以可视化为多维数组。因此,切片也有助于对图像执行一些数学运算。下面提到了一些重要和高级示例,以增加您的理解:

# Select all but one-pixel border 
pixel_matrix[1:-1,1:-1] 		

# swap channel order 
pixel_matrix = pixel_matrix[:,:,::-1]

# Set dark pixels to black 	
pixel_matrix[pixel_matrix<10] = 0

# select 2nd and 4th-row		
pixel_matrix[[1,3], :]	

阵列聚合和缩减

现在,我们将从 numpy 数组上的聚合操作开始。通常,您可以执行的操作如下:

  1. 查找数组中所有元素的总和和乘积。
  2. 查找数组中的最大值和最小值元素
  3. 查找数组中特定元素的计数
  4. 我们还可以使用线性代数模块找到其他参数,包括矩阵行列式、矩阵迹线、矩阵特征值和特征向量等。

让我们通过示例开始讨论每个功能:

案例 1:数组中存在的所有元素的代数和

array_1 = numpy.array([[1,2,3], [4,5,6]])
print(array_1.sum())
#Output: 
21

案例 2:数组中的最大元素

array_1 = numpy.array([[1,2,3], [4,5,6]])
print(array_1.max())
#Output: 
6

案例 3:数组中的最小元素

array_1 = numpy.array([[1,2,3], [4,5,6]])
print(array_1.min())
#Output: 
1

案例 4:数组中最大元素所在的元素的位置/索引

array_1 = numpy.array([[1,2,3], [4,5,6]])
print(array_1.argmax())
#Output: 
5

案例 5:数组中最小元素所在的元素的位置/索引

array_1 = numpy.array([[1,2,3], [4,5,6]])
print(array_1.argmin())
#Output: 
0

在查找位置时,您可以观察到它将任何多维数组视为一维数组,然后对其进行计算。

案例 6:数组中所有元素的平均值/平均值

array_1 = numpy.array([[1,2,3], [4,5,6]])
print(array_1.mean())
#Output: 
3.5

案例7:二维数组的点积/标量积

array_1 = numpy.array([[1,2], [4,5]])
array_2 = numpy.array([[1,-1,2], [3,7,-2]])
t = array_1.dot(array_2)
print(t)
#Output: 
[[ 7 13 -2]
 [19 31 -2]]

数字数组中的矢量化

矢量化允许对整个数组执行操作,而不是遍历单个元素。它利用优化的低级例程,从而产生更快、更简洁的代码。

法典:

a = numpy.array([1, 2, 3, 4, 5])
b = numpy.array([10, 20, 30, 40, 50])
c = a + b  # Element-wise addition without explicit loops

根据上面的示例,您可以看到创建了两个名为“a”和“b”的 NumPy 数组。在执行操作 'a + b' 时,我们使用矢量化概念在数组之间执行逐元素加法,从而生成一个新的数组 'c',其中包含来自 'a' 和 'b' 的相应元素之和。因此,由于元素操作,程序避免运行显式循环,并利用优化的例程进行高效计算。

数组串联

情况 1:假设您有两个或多个数组要使用 concatenate 函数进行连接,您必须在其中连接数组的元组。

法典:

# concatenate 2 or more arrays using concatenate function row-wise
numpy_array_1 = numpy.array([1,2,3])
numpy_array_2 = numpy.array([4,5,6])
numpy_array_3 = numpy.array([7,8,9])
array_concatenate = numpy.concatenate((numpy_array_1, numpy_array_2, numpy_array_3))
print(array_concatenate)
#Output:
[1 2 3 4 5 6 7 8 9]

情况 2:假设您有一个具有多个维度的数组;然后,要连接数组,您必须提及必须连接这些数组的轴。否则,它将沿第一个维度执行。

法典:

# concatenate 2 or more arrays using concatenate function column-wise
array_1 = numpy.array([[1,2,3], [4,5,6]])
array_2 = numpy.array([[7,8,9], [10, 11, 12]])
array_concatenate = numpy.concatenate((array_1, array_2), axis=1)
print(array_concatenate)
#Output:
[[ 1  2  3  7  8  9]
 [ 4  5  6 10 11 12]]

数学函数和通用函数

这些通用函数也称为 ufuncs。在这些函数中执行元素操作。例如:

  1. NP.exp
  2. NP.sqrt
  3. 新冼
  4. NP.cos
  5. np.isnan

法典:

A = np.array([1,4,9,16,25])
B = np.sqrt(A)
#Output
[1. 2. 3. 4. 5.]

性能比较

在执行数值计算时,如果我们有大量的计算,Python 需要很多时间。如果我们取一个形状为 1000 x 1000 的矩阵并进行矩阵乘法,那么 Python 和 numpy 所需的时间是:

  1. Python 三重循环需要 > 10 分钟
  2. 数字需要 ~0.03 秒

因此,从上面的例子中,我们可以看到numpy需要的时间比标准python少得多,因此在与数据科学相关的现实生活中,我们的延迟减少了,数据科学有大量数据需要处理。

包起来

在本文中,我们讨论了 numpy 数组。因此,为了结束我们的会议,让我们总结一下numpy相对于Python的优势:

  1. Numpy具有面向阵列的计算。
  2. Numpy有效地实现了多维数组。
  3. Numpy主要是为科学计算而设计的。
  4. Numpy 包含标准的数学函数,可以在没有循环的数组上更快地计算。
  5. Numpy 具有内置的线性代数和随机数生成模块,可以使用傅里叶变换功能。
  6. Numpy还包含用于读取和写入数组到磁盘以及处理内存映射文件的工具。


原文链接:提升数学效率:导航 Numpy 数组操作 (mvrlink.com)

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。