numpy.sum()可以对numpy数组中的元素进行求和运算,在不指定参数axis时,会对所有的元素进行求和
a = np.array(
[[1,2,3],
[2,3,4]]
)
a.sum() # 结果:15
当指定axis时,会按照参数设置对指定坐标轴进行加和,这个参数其实有点抽象,先看例子:
a.sum(axis=0) # 结果:[3, 5, 7]
a.sum(axis=1) # 结果:[6, 9]
再加一维就有点混乱:
b = np.array(
[[[1,2,3],
[2,3,4]],
[[3,4,5],
[4,5,6]]]
)
b.sum(axis=0) # 结果:[[ 4, 6, 8], [ 6, 8, 10]]
b.sum(axis=1) # 结果:[[ 3, 5, 7], [ 7, 9, 11]]
b.sum(axis=2) # 结果:[[ 6, 9], [12, 15]]
axis这时还可以是元组,更抽象
b.sum(axis=(0,1)) #结果:[10, 14, 18]
b.sum(axis=(0,2)) # 结果:[18, 24]
我们在想象一个数组时,往往喜欢将数组想象为一个几何图形,如将二位数组想象为平面中的网格,三维则是空间中的立方体,这种方法几乎成了了人们思维的贯式,但这种方法有很大的局限性。在2维,3维时我们尚可在脑中想象,或在纸上画出草图,但更高维则非常困难。所以在理解numpy数组时,不应该将数组想象为几何图形,反而从符号上直接入手会更容易。
在这个问题中,我们把三维数组b看作b[][][] ,从左到右依次是第0,1,2维的下标。而axis参数指定了某一个维度,求和结果的形状就是其他两个维度的形状,结果的值就是其他两个维度(axis指定维度之外的维度)指定情况下,该维度(axis指定维度)所有值的和。
换句话来说,axis所指定的维度就是加和时要循环的维度
用上面的a,b两个数组举例子:a.sum(axis=0),其中a.shape=(2, 3), 我们可以知道求和结果s的形状为(3,),结果中的每一个值s[i]就是:
s[i] = a[0][i] + a[1][i] + a[2][i]
说人话(空间理解)就是对 2行 3列 的a,求每列的和。axis指定了第0维,加和时要循环的维度就是第0维度,即循环行,结果就是对每列求和。
复杂的情况:b.sum(axis=(0,1)),其中b.shape=(2,2,3),我们可以得到求和结果s的形状为(3,),结果中的每一个值s[i]就是:
s[i] = b[0][0][i] + b[0][1][i] + b[1][0][i] + b[1][1][i]
说人话就是对 长2 宽2 层数为3 的b,求每一层的和。axis指定了第(0, 1)维,加和时要循环的维度就是第0和第1维度,即循环长宽,结果就是对每一层求和。
b.sum(axis=2),其中b.shape=(2,2,3),我们可以得到求和结果s的形状为(2, 2),结果中的每一个值s[i][j]就是:
s[i][j] = b[i][j][0] +b[i][j][1] +b[i][j][2]
说人话就是对 长2 宽2 层数为3 的b,求长宽二维平面每一点上所有层的和。axis指定了第2维,加和时要循环的维度就是第2维,即循环每一层,结果就是长宽的二维平面,平面上每一个点代表其位置上所有层的和 。