关于效率
Numpy包含很多高效的函数,能够替换普通的循环,实现非常快
累加变成向量运算
对向量每个元素进行某个运算生成另一个向量
普通用法
1
2
3
4
5
6import numpy as np
a = np.zeros((n, 1))
b = np.zeros((n, 1))
for i in range(n):
b[i] = math.exp(a[i])高效用法
1
2
3import numpy as np
a = np.zeros((n, 1))
b = np.exp(a)相似的还有
log
,abs
等函数
值得关注的广播机制(broadcasting)
- 当两个向量(
numpy
的对象)的维度不同时,Python会将维度小的一个拓展(复制)成与维度大的相同,以便于计算 - 举例
1
2a = np.zeros((n, 1))
b = a + 10
广播规则
形式1
1
2
3(m,n) [+-*/] (m,1)
<===>
(m,n) [+-*/] (m,n) # 按列复制第二个n次形式2
1
2
3(m,n) [+-*/] (1,n)
<===>
(m,n) [+-*/] (m,n) # 按行复制第二个m次形式3
1
2
3(m,n) [+-*/] r # r为实数,维度为1
<===>
(m,n) [+-*/] (m,n) # 复制r m*n 次形式4
1
2
3(m,1) [+-*/] (1,n)
<===>
(m,n) [+-*/] (m,n) # 按行复制第二个m次,并按列复制第一个n次
需要注意
- 广播机制使得书写更加美观,代码更加简洁
- 但广播机制往往会出现用户意想不到的微妙bug, 需要开发者注意
关于矩阵运算的维度
axis=i
表示第i
维计算后将会消失(该维度的size变成1)
多使用reshape函数
- reshape函数复杂度是常数的(O(1))
- reshape函数可确保我们的程序正确,不用随意猜测矩阵的维度