NumPy Sum(带轴)如何工作?

Jam*_*mes 15 python numpy

我已经接受了自己,以了解如何NumPy为我自己的好奇心而努力.

似乎最简单的函数是最难转换为代码(我理解为代码).对于每种情况,很容易对每个轴进行硬编码,但我想找到一个动态算法,该算法可以在具有n维的任何轴上求和.官方网站上的文档没有帮助(它只显示结果而不是过程),并且很难浏览Python/C代码.

注意:我确实发现,当一个数组相加时,指定的轴被"移除",即形状为(4,3,2)且轴为1的数组的总和产生一个形状为(4,2)

piR*_*red 79

建立

考虑numpy数组 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]]]
Run Code Online (Sandbox Code Playgroud)

尺寸在哪里?

尺寸和位置由以下突出显示

            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
Run Code Online (Sandbox Code Playgroud)

尺寸示例:

通过一些例子,这变得更加清晰

a[0, :, :] # dim 0, pos 0

[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]
Run Code Online (Sandbox Code Playgroud)
a[:, 1, :] # dim 1, pos 1

[[ 5  6  7  8  9]
 [20 21 22 23 24]]
Run Code Online (Sandbox Code Playgroud)
a[:, :, 3] # dim 2, pos 3

[[ 3  8 13]
 [18 23 28]]
Run Code Online (Sandbox Code Playgroud)

sum

解释sumaxis
a.sum(0)是所有切片的总和dim 0

a.sum(0)

[[15 17 19 21 23]
 [25 27 29 31 33]
 [35 37 39 41 43]]
Run Code Online (Sandbox Code Playgroud)

与...一样

a[0, :, :] + \
a[1, :, :]

[[15 17 19 21 23]
 [25 27 29 31 33]
 [35 37 39 41 43]]
Run Code Online (Sandbox Code Playgroud)

a.sum(1) 是所有切片的总和 dim 1

a.sum(1)

[[15 18 21 24 27]
 [60 63 66 69 72]]
Run Code Online (Sandbox Code Playgroud)

与...一样

a[:, 0, :] + \
a[:, 1, :] + \
a[:, 2, :]

[[15 18 21 24 27]
 [60 63 66 69 72]]
Run Code Online (Sandbox Code Playgroud)

a.sum(2) 是所有切片的总和 dim 2

a.sum(2)

[[ 10  35  60]
 [ 85 110 135]]
Run Code Online (Sandbox Code Playgroud)

与...一样

a[:, :, 0] + \
a[:, :, 1] + \
a[:, :, 2] + \
a[:, :, 3] + \
a[:, :, 4]

[[ 10  35  60]
 [ 85 110 135]]
Run Code Online (Sandbox Code Playgroud)

默认轴是-1
指所有轴.或者总结所有数字.

a.sum()

435
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你!切片索引和视觉结构有很大帮助,现在我终于可以在脑海中绘制出这个过程了。 (2认同)