python库numpy提供的求和方法np.sum(),可以对数组和矩阵进行求和。sum方法可以接收多个参数,主要是数组a,坐标轴axis,数据类型dtype,初始值initial。其中,axis对于我们来说比较容易迷糊,这个值对求和有什么影响?一般来说,不设置axis这个参数,那么就是把数组或者矩阵所有元素求和,不管数组是一维,还是多维,最终会把每一个元素相加求和。

如下数组,是一个2维数组,每一维又是一个3*4的二维数组。

[[
[1,2,3,1],
[2,3,4,1],
[3,4,1,2]
],[
[1,0,2,0],
[0,1,0,2],
[3,2,1,0]
]]

这里可以看作是一个x,y,z三个维度的数组。axis=0,1,2,可以分别表示按照x,y,z轴来定位并计算他们的和。

axis=0x = 0,1

表达式 a[0][y][z]+a[1][y][z]

求和结果 [3*4]

a[0][y0][z0]+a[1][y0][z0] a[0][y0][z1]+a[1][y0][z1] a[0][y0][z2]+a[1][y0][z2] a[0][y0][z3]+a[1][y0][z3]
= 1 + 1 = 2 = 2 + 0 = 2 = 3 + 2 = 5 = 1 + 0 = 1
a[0][y1][z0]+a[1][y1][z0] a[0][y1][z1]+a[1][y1][z1] a[0][y1][z2]+a[1][y1][z2] a[0][y1][z3]+a[1][y1][z3]
= 2 + 0 = 2= 3 + 1 = 4 = 4 + 0 = 4 = 1 + 2 = 3
a[0][y2][z0]+a[1][y2][z0] a[0][y2][z1]+a[1][y2][z1] a[0][y2][z2]+a[1][y2][z2] a[0][y2][z3]+a[1][y2][z3]
= 3 + 3 = 6 = 4 + 2 = 6= 1 + 1 = 2 = 2 + 0 = 2

[[2,2,5,1],
[2,4,4,3],
[6,6,2,2]]

axis=1y = 0,1,2

表达式 a[x][0][z]+a[x][1][z]+a[x][2][z]

求和结果 [2*4]

a[x0][0][z0]+a[x0][1][z0]+a[x0][2][z0] a[x0][0][z1]+a[x0][1][z1]+a[x0][2][z1] a[x0][0][z2]+a[x0][1][z2]+a[x0][2][z2] a[x0][0][z3]+a[x0][1][z3]+a[x0][2][z3]
= 1 + 2 + 3 = 6 = 2 + 3 + 4 = 9 = 3 + 4 + 1 = 8= 1 + 1 + 2 = 4
a[x1][0][z0]+a[x1][1][z0]+a[x1][2][z0] a[x1][0][z1]+a[x1][1][z1]+a[x1][2][z1] a[x1][0][z2]+a[x1][1][z2]+a[x1][2][z2] a[x1][0][z3]+a[x1][1][z3]+a[x1][2][z3]
= 1 + 0 + 3 = 4 = 0 + 1 + 2 = 3 = 2 + 0 + 1 = 3= 0 + 2 + 0 = 2

[[6,9,8,4],
[4,3,3,2]]

axis=2z = 0,1,2,3

表达式 a[x][y][0]+a[x][y][1]+a[x][y][2]+a[x][y][3]

求和结果 [2*3]
a[x0][y0][0]+a[x0][y0][1]+a[x0][y0][2]+a[x0][y0][3] a[x0][y1][0]+a[x0][y1][1]+a[x0][y1][2]+a[x0][y1][3] a[x0][y2][0]+a[x0][y2][1]+a[x0][y2][2]+a[x0][y2][3]
= 1 + 2 + 3 + 1 = 7 = 2 + 3 + 4 + 1 = 10= 3 + 4 + 1 + 2 = 10
a[x1][y0][0]+a[x1][y0][1]+a[x1][y0][2]+a[x1][y0][3] a[x1][y1][0]+a[x1][y1][1]+a[x1][y1][2]+a[x1][y1][3] a[x1][y2][0]+a[x1][y2][1]+a[x1][y2][2]+a[x1][y2][3]
= 1 + 0 + 2 + 0 = 3 = 0 + 1 + 0 + 2 = 3 = 3 + 2 + 1 + 0 = 6

[[7,10,10],
[3,3,6]]

以上结果可以通过python代码来验证:

如下数组:[[0,1],[0,5]]是一个二维数组,直接求和结果就是6。

这里,因为是一个二维数组,所以axis可以取值0、1。

通过程序验证一下:

对于这个二维数组求和,可以也可以这么理解它,当axis=0时,求和就是数组投影到x轴的结果。当axis=1时,求和就是数组投影到y轴的结果。

以上的过程演示的其实是np.sum()官方给出的示例:

这里主要介绍了axis取值对求和结果的影响,axis其实可以看做是一个x,y,z轴的一个索引,索引可以从0开始,到size-1。也可以从-1开始,就是取负值,我们可以利用上面的第二个示例来作验证:

这个结果与上面求和计算axis=1是一样的。

官方文档里面有这样一句话:

If axis is negative it counts from the last to the first axis.

简单翻译一下就是如果axis是负值,那么就从最后一个坐标轴往第一个坐标轴开始算起。

===================

np.sum()求和还有一些参数,比如dtype,这个比较有意思,比如我们给出的数组元素都是浮点数,但是最后这里设置dtype=np.int32,最终计算求和,是按照整数来计算:

还有一个initial参数很容易理解,就是设置求和初始值,一般默认是0,这里可以设置一个初始值:

np.sum求和,难以理解的地方在于axis取值,以及取值之后求和该如何计算。axis确定之后,它的取值范围决定了求和计算的数字由多少个组成,最后生成的结果数组由余下的维度 乘积 决定。