NumPy 数组常用操作
导入NumPy
NumPy 是外部库。所谓的外部库是指不包含在标准的Python当中。所以想要使用需要提前引入。
import numpy as np
python当中引入一个库文件需要通过import 来引入。这里的import 可以直译为“将NumPy作为np导入”。之后NumPy的方法均可以通过np来调用。
生成NumPy 数组
要生成NumPy数组,需要使用np.array()这个api。
这个api接收的参数为python的列表,从而生成NumPy数组( numpy.ndarray )。
import numpy as np x = np.array([1.0,2.0,3.0]) print(x) ''' 输出的结果: [ 1. 2. 3.] ''' # 可以通过type查看类型 type(x) ''' 输出结果: <class 'numpy.ndarray'> '''
NumPy的算术运算
下面是NumPy数组的算术运算示例:
import numpy as np # numpy的算术运算 x = np.array([1,2,3]) y = np.array([4,5,6]) print(x + y) #[5,7,9] a = np.array([1.0,2.0,3.0]) b = np.array([4.0,5.0,6.0]) print(a + b) # [5.,7.,9.] # 当两个数组的元素个数相同时,是可以进行运算的。但是如果元素个数不同,程序就会报错。 # "对应元素的" 翻译过来就是 element-wise 例如对应元素的乘法就是 element-wise product
NumPy 数组除了可以进行加法运算,也可以进行其他的数学运算。
NumPy 数组不仅可以进行 element-wise 运算,也可以和单一的数值(标量)组合起来进行运算。此时,需要在 NumPy 数组的各个元素和标量之间进行运算。这个功能也被称为广播。
>>> x = np.array([1.0, 2.0, 3.0]) >>> x / 2.0 array([ 0.5, 1. , 1.5])
NumPy的N维数组
NumPy 不仅可以生成一维数组(排成一列的数组),也可以生成多维数组。比如,可以生成如下的二维数组(矩阵)。
>>> A = np.array([[1, 2], [3, 4]]) >>> print(A) [[1 2] [3 4]] >>> A.shape (2, 2) >>> A.dtype dtype('int64')
在NumPy数组中,可以通过shape()方法查看形状,通过dtype()方法查看类型。
矩阵数组也可以进行数学运算。
>>> A = np.array([[1, 2], [3, 4]])
>>> B = np.array([[3, 0],[0, 6]]) >>> A + B array([[ 4, 2], [ 3, 10]]) >>> A * B array([[ 3, 0], [ 0, 24]])
和数组的算术运算一样,矩阵的算术运算也可以在相同形状的矩阵间以对应元素的方式进行。并且,也可以通过标量(单一数值)对矩阵进行算术运算。这也是基于广播的功能。
>>> A = np.array([[1, 2], [3, 4]])
>>> A * 10 array([[ 10, 20], [ 30, 40]])
NumPy 数组(np.array)可以生成 N 维数组,即可以生成一维数组、二维数组、三维数组等任意维数的数组。数学上将一维数组称为向量,将二维数组称为矩阵。另外,可以将一般化之后的向量或矩阵等统称为张量(tensor)。
广播
NumPy 中,形状不同的数组之间也可以进行运算。之前的例子中,在 2×2 的矩阵 A 和标量 10 之间进行了乘法运算。在这个过程中,标量10 被扩展成了 2 × 2 的形状,然后再与矩阵 A 进行乘法运算。这个巧妙的功能称为广播(broadcast)。
下面这个运算就是一个广播的例子。
>>> A = np.array([[1, 2], [3, 4]]) >>> B = np.array([10, 20]) >>> A * B array([[ 10, 40], [ 30, 80]])
在上面的运算中,一维数组 B 被“巧妙地”变成了和二位数组A 相同的形状,然后再以对应元素的方式进行运算。
综上,因为 NumPy 有广播功能,所以不同形状的数组之间也可以顺利地进行运算。
访问数组当中的元素
元素的索引从 0 开始。对各个元素的访问可按如下方式进行。
>>> X = np.array([[51, 55], [14, 19], [0, 4]]) >>> print(X) [[51 55] [14 19] [ 0 4]] >>> X[0] # 第0行 array([51, 55]) >>> X[0][1] # (0,1)的元素55
也可以使用 for 语句访问各个元素。
>>> X = np.array([[51, 55], [14, 19], [0, 4]])
>>> for row in X: ... print(row) ... [51 55] [14 19] [0 4]
除了前面介绍的索引操作,NumPy 还可以使用数组访问各个元素。
>>> X = X.flatten()#将X转换为一维数组 >>> print(X) [51 55 14 19 0 4] >>> X[np.array([0, 2, 4])] # 获取索引为0、2、4的元素 array([51, 14, 0])
通过上述的这种标记方式,可以获取满足一定条件的元素。例如,要获取大于15的元素,可以写成下面的格式。
import numpy as np a = np.array([[11,22,33],[44,55,66],[77,88,99]]) b = a.flatten() # 将张量转换为一维数组 print(b) # [11 22 33 44 55 66 77 88 99] # 通过数组获取一维数组元素 # print(b[np.array([1,3,5,7])]) # [22 44 66 88] print(b > 15) # [False True True True True True True True True] print(b[b > 15]) # [22 33 44 55 66 77 88 99]