我已经学会了如何根据自己NumPy的好奇心来工作。
NumPy
似乎最简单的功能最难翻译为代码(我理解代码)。对每种情况的每个轴进行硬编码很容易,但是我想找到一种动态算法,可以在任何轴上以n维求和。官方网站上的文档没有帮助(仅显示结果而不显示过程),并且很难浏览Python/ C代码。
注意: 我确实弄清楚了当对一个数组求和时,指定的轴是“已删除”,即,形状为(4,3,2)且轴为1的数组的总和会得出形状为的数组的答案(4,2)
考虑numpy数组 a
a
a = np.arange(30).reshape(2, 3, 5) print(a) [[[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14]] [[15 16 17 18 19] [20 21 22 23 24] [25 26 27 28 29]]]
尺寸和位置由以下内容突出显示
p p p p p o o o o o s s s s s dim 2 0 1 2 3 4 | | | | | dim 0 ↓ ↓ ↓ ↓ ↓ ----> [[[ 0 1 2 3 4] <---- dim 1, pos 0 pos 0 [ 5 6 7 8 9] <---- dim 1, pos 1 [10 11 12 13 14]] <---- dim 1, pos 2 dim 0 ----> [[15 16 17 18 19] <---- dim 1, pos 0 pos 1 [20 21 22 23 24] <---- dim 1, pos 1 [25 26 27 28 29]]] <---- dim 1, pos 2 ↑ ↑ ↑ ↑ ↑ | | | | | dim 2 p p p p p o o o o o s s s s s 0 1 2 3 4
通过一些示例,这一点变得更加清楚
a[0, :, :] # dim 0, pos 0 [[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14]]
a[:, 1, :] # dim 1, pos 1 [[ 5 6 7 8 9] [20 21 22 23 24]]
a[:, :, 3] # dim 2, pos 3 [[ 3 8 13] [18 23 28]]
sum
的解释sum和axis a.sum(0)沿所有切片的总和dim 0
axis
a.sum(0)
dim 0
a.sum(0) [[15 17 19 21 23] [25 27 29 31 33] [35 37 39 41 43]]
和…一样
a[0, :, :] + \ a[1, :, :] [[15 17 19 21 23] [25 27 29 31 33] [35 37 39 41 43]]
a.sum(1) 是沿着所有切片的总和 dim 1
a.sum(1)
dim 1
a.sum(1) [[15 18 21 24 27] [60 63 66 69 72]]
a[:, 0, :] + \ a[:, 1, :] + \ a[:, 2, :] [[15 18 21 24 27] [60 63 66 69 72]]
a.sum(2) 是沿着所有切片的总和 dim 2
a.sum(2)
dim 2
a.sum(2) [[ 10 35 60] [ 85 110 135]]
a[:, :, 0] + \ a[:, :, 1] + \ a[:, :, 2] + \ a[:, :, 3] + \ a[:, :, 4] [[ 10 35 60] [ 85 110 135]]
默认轴是-1 指所有轴。或将所有数字相加。
-1
a.sum() 435