NumPy 学习笔记
import numpy as np
1 维数组(1-D Array)
创建向量:
# 零向量
np.zeros(4) # [0. 0. 0. 0.]
np.random.random_sample(4) # [0.13874093 0.76087955 0.17028386 0.10573206]
# Array Range
np.arange(4.) # [0. 1. 2. 3.] 加 . 号代表浮点数
np.random.rand(4) # [0.30553381 0.00115535 0.71271101 0.65088795]
# 自定义元素值
np.array([5,4,3,2]) # [5 4 3 2]
np.array([5.,4,3,2]) # [5. 4. 3. 2.],np 矩阵的元素类型必须相同
元素相关的运算:
a = np.array([1,2,3,4])
b = -a
b = a**2
b = np.sum(a)
b = np.mean(a)
b = np.power(a, 2)
点积:
a = np.array([1, 2, 3, 4])
b = np.array([-1, 4, 3, 2])
c = np.dot(a, b)
在使用
np.dot()
函数时 NumPy 会自动利用底层硬件中的可用数据并行机制来加速计算
应用阈值:
yhat = (predictions >= 0.5).astype(int)
2 维数组(2-D Array)
习惯上建议将所有 2 维数组看成由列向量组成的矩阵。
创建矩阵:
# 零矩阵
a = np.zeros((1, 5))
# [[0. 0. 0. 0. 0.]]
a = np.zeros((2, 1))
# [[0.]
# [0.]]
np.zeros_like(a)
# [[0.]
# [0.]]
# 随机矩阵
np.random.random_sample((1, 1))
# [[0.44236513]]
# 自定义元素值
a = np.array([[5],
[4],
[3]]);
# [[5]
# [4]
# [3]]
矩阵操作:
a = np.arange(6).reshape(-1, 2) # -1 表示根据另一项的值自动计算。这里相当于 (3, 2)
# [[0 1]
# [2 3]
# [4 5]]
a[2,0] # 4。相当于 a[2][0]
a.T # A 的转置
矩阵乘法:
np.matmul(a.T, a) # 矩阵乘法
a.T @ a # 矩阵乘法的另一种写法
np.dot(a.T, a) # dot 也可以用来矩阵相乘
a * a # 逐点乘(元素乘法)
np.matmul(a.T, a)
和 np.dot(a.T, a)
的区别:
-
基本用法:
- 对于二维数组或矩阵,
np.matmul
和np.dot
的行为是相同的,都是执行标准的矩阵乘法。因此对于二维数组a.T
和a
,np.matmul(a.T, a)
和np.dot(a.T, a)
将得到相同的结果。
- 对于二维数组或矩阵,
-
高维数组处理:
np.dot
可以用于计算两个数组间的点积,对于多维数组,它会将最后一个轴与倒数第二个轴进行乘积运算,并沿其他维度进行广播。np.matmul
则专门用于矩阵乘法,它只能用于二维矩阵或堆叠的二维矩阵(高维数组的后两个轴进行矩阵乘法),并不能进行更一般的点积运算。
-
广播规则:
np.matmul
支持自动的维度扩展和广播,对于高维数组,它会在后两个轴进行矩阵乘法运算。np.dot
不支持这种自动的维度扩展,结果的形状取决于输入数组的形状和点积规则。
a = np.arange(20).reshape(-1, 10) # reshape 有着常量计算复杂度,性能损失很小
# [[ 0 1 2 3 4 5 6 7 8 9]
# [10 11 12 13 14 15 16 17 18 19]]
a.sum(axis=0) # axis = 0 表示对纵轴求和,axis = 1 表示对横轴求和
a[0, 2:7:1] # 对第 0 行取 2 到 7 列(不包括 7)
# [2 3 4 5 6]
a[:, 2:7:1]
# [[ 2 3 4 5 6]
# [12 13 14 15 16]]
a.flatten()
# [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]
a.squeeze()
# 去掉所有为 1 的维度
# 获取矩阵形状
m = x_train.shape[0] # 等价于 len(x_train)
在使用 NumPy 创建向量时,最好使用 np.random.randn(5, 1)
而不是 np.random.randn(5)
。前者是一个列向量,可以确保在进行运算时遵循向量运算法则;而后者是一个秩为 1 的数组,在运算时可能出现与预期不一致的行为。
常用图像处理函数
图像填充(padding):
输入图像为 \(X = (m, n_{\text{w}}, n_{\text{h}}, n_{\text{c}})\)
对图像的长和宽进行 padding = 1
的填充:
np.pad(a, ((0,0), (1,1), (1,1), (0,0)), mode='constant', constant_values = (0,0))