Python中Numpy库中的np.sum(array,axis=0,1,2...)怎么理解?

c = np.array([[[0, 1, 2,3], 
               [4, 5, 6,7]],
               [[1, 2, 3,4],
                [5,6,7,8]]]
                
 print( c.sum(axis=0))
 print( c.sum(axis=1)) 
 print( c.sum(axis=2))   

clipboard.png

请问三个输出该怎么理解?

阅读 12.7k
3 个回答

首先可以把c可以看作一个2x2的矩阵,而矩阵的每个元素是一个长度为4的数组(例如[0, 1, 2, 3]),因此c是一个三维array。

当参数axis = 0时,求矩阵每一列上元素的和。例如,对第一列上的两个数组[0, 1, 2, 3]和[1, 2, 3, 4]相加,返回一个新的数组[1, 3, 4, 7],后面的列依次类推。因此最后得到一个新的数组,即:

>>> np.sum(c,axis = 0)
array([[ 1,  3,  5,  7],
       [ 9, 11, 13, 15]])

axis = 1时,对矩阵每一行 上的元素进行求和,同上。

axis = 2时,对矩阵每个元素进行求和,即对你矩阵中每个列表内的元素求和,返回一个新的2x2矩阵。这听起来有些奇怪,但前提必须是一个三维数组,且axis的值必须小于数组的维度,否则会出现异常:

ValueError: 'axis' entry is out of bounds

此外,还能通过索引来得到c中的每个元素,例如:

>>> c[0] #第一行
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])
>>> c[0,1] #第一行中的二个列表
array([4, 5, 6, 7])
>>> c[0, 1, 1] #第一行中的二个列表的第二个元素
5

希望答案对你有帮助。

一个不是很简单,但是很好理解的方法是:你的输入矩阵的shape是(2,2,4),那么当axis=0时,就是在第一个dimension上进行求和,最后得到的结果的shape就是去掉第一个dimension后的shape,也就是(2,4)。具体的计算方法则是,对于c[i,j,k],假设输出矩阵为s[j,k],第一个dimension求和那么就是 $$s[j,k]=\sum_i(c[i,j,k])$$

如果axis=1,那么输出shape就是去掉第二个dim,也就是(2,4),计算是 $s[i,k]=sum_j(c[i,j,k])$

如果axis=2,那么输出shape就是去掉第三个dim,也就是(2,2),计算是 $s[i,j]=sum_k(c[i,j,k])$

在数据处理里面经常会碰到高维数据,通过二维矩阵去想它的计算方法就很难了,这个时候只要按axis对应的维度求和,其他维度的位置和形状不变,最后把shape去掉对应维度就能理解了

我之前理解错了,采纳正解

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏