七: NumPy的使用
在深度学习的实现中,经常出现数组和矩阵的计算。NumPy 的数组类(numpy.array )中提供了很多便捷的方法,在实现深度学习时,我们将使用这些方法.
NumPy 是外部库。这里所说的“外部”是指不包含在标准版 Python 中。因此,我们首先要导入 NumPy 库. 如果没有安装UNumPy的话需要首先安装,IDE中在导入时进行安装即可.
1. NumPy数组的基本运算
要生成 NumPy 数组,需要使用 np.array() 方法。np.array() 接收 Python 列表作为参数,生成 NumPy 数组(numpy.ndarray )
import numpy as npa = np.array([1, 2, 3])
b = np.array([2, 4, 6])
print(a + b)
print(a - b)
print(a * b)
print(a / b)输出:
[3 6 9]
[-1 -2 -3]
[ 2 8 18]
[0.5 0.5 0.5]
当两个数组的元素个数相同时,对数组进行算数运算就是对数组中的对应元素进行算数运算
如果是数组与单个数值(标量)进行运算,则是数组中的元素分别与此数进行运算,此功能也称广播
import numpy as npa = np.array([1, 2, 3])
b = 2
print(a + b)
print(a - b)
print(a * b)
print(a / b)输出:
[3 4 5]
[-1 0 1]
[2 4 6]
[0.5 1. 1.5]
2. NumPy的N维数组
NumPy 不仅可以生成一维数组(排成一列的数组),也可以生成多维数组。比如,可以生成如下的二维数组(矩阵),矩阵的变量名用大写字母表示
多维数组与一维数组的运算规则一致
矩阵的形状可以通过 shape 查看,矩阵元素的数据类型可以通过 dtype 查看
import numpy as npA = np.array([[1, 2], [2, 4]])
B = np.array([[5, 6], [7, 8]])
print(A.shape, B.shape)
print(A.dtype, B.dtype)
print(A + B)
print(A - B)
print(A * B)
print(A / B)
print(A * 10)输出:
(2, 2) (2, 2)
int64 int64
[[ 6 8][ 9 12]]
[[-4 -4][-5 -4]]
[[ 5 12][14 32]]
[[0.2 0.33333333][0.28571429 0.5 ]]
[[10 20][20 40]]
NumPy 数组(np.array )可以生成 N 维数组,即可以生成一维数组、二维数组、三维数组等任意维数的数组。数学上将一维数组称为向量 ,将二维数组称为矩阵 。另外,可以将一般化之后的向量或矩阵等统称为张量 (tensor)。
3. 广播
NumPy 中,形状不同的数组之间也可以进行运算。之前的例子中,在 2×2 的矩阵 A 和标量 10 之间进行了乘法运算。在这个过程中,标量 10 被扩展成了 2 × 2 的形状(每个元素都为10),然后再与矩阵 A 进行乘法运算。这个巧妙的功能称为广播 (broadcast)
当二维数组与一维数组运算时,会将一维数组的元素进行复制形成二维数组来进行运算
import numpy as npA = np.array([[1, 2], [2, 4]])
B = np.array([[5, 6]])
print(A + B)
print(A - B)
print(A * B)
print(A / B)
此时会将B数组视为[[5,6],[5,6]]来参与运算
4. 数组元素访问
4.1 通过索引访问
import numpy as npA = np.array([[11, 32], [24, 77], [15, 63]])
# 多维数组中每个元素为一个独立的子数组
print(A[0])
# 再通过子数组索引取到具体位置的元素
s = A[0]
print(s[1])
print(A[0][1])输出:
[11 32]
32
32
4.2 通过for循环访问
import numpy as npA = np.array([[11, 32], [24, 77], [15, 63]])
for row in A:print(row)输出:
[11 32]
[24 77]
[15 63]
可见,多维数组的子元素也是一个数组
4.3 通过数组访问元素
import numpy as npA = np.array([[11, 32], [24, 77], [15, 63]])
# flatten() 方法可以将多维数组转为一维数组
b = A.flatten()
print(b)
# 通过数组获取对应索引位置的元素
c = b[np.array([0, 2, 4])]
print(c)输出:
[11 32 24 77 15 63]
[11 24 15]
对 NumPy 数组使用不等号运算符等,结果会得到一个布尔型的数组,使用这个布尔型数组就可取出数组的各个元素(取出 True 对应的元素)
import numpy as npA = np.array([[11, 32], [24, 77], [15, 63]])
print(A > 15)
print(A[A > 15])输出:
[[False True][ True True][False True]]
[32 24 77 63]