整体说明
- 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 函数可确保我们的程序正确,不用随意猜测矩阵的维度
附录:使用 numpy 包为 Python 内置对象提效
numpy包可以直接操作list等对象1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22# # 一维数组
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
mean = np.mean(arr)
print(mean) # 输出:3.0,整数数组计算均值默认返回浮点数(如 int32 数组返回 float64);若指定 dtype=np.int32,结果会向下取整
# # 二维数组
arr = np.array([[1, 2, 3],
[4, 5, 6]])
# 沿轴0(列方向)计算均值:每列的均值
mean_axis0 = np.mean(arr, axis=0)
print(mean_axis0) # 输出:[2.5 3.5 4.5]
# 沿轴1(行方向)计算均值:每行的均值
mean_axis1 = np.mean(arr, axis=1)
print(mean_axis1) # 输出:[2. 5.]
# 全局均值(展平后)
mean_all = np.mean(arr)
print(mean_all) # 输出:3.5注意事项:
- 若数组包含
np.nan,np.mean会返回nan,需用np.nanmean忽略缺失值 - 对空数组调用
np.mean会抛出RuntimeWarning,并返回nan
- 若数组包含
np.mean支持多维数组、指定轴计算,且效率远高于 Python 内置的statistics.mean(statistics是 Python 内置库)