Python中np.sum()对axis的个人理解,超详细

你们讨论的axis=0和1并不是简单的行和列,axis=0表示的是第一个维度,在第一个维度上的元素间进行求和、比较大小,axis=1表示的是第二个维度,在第二个维度上的元素间进行求和、比较大小。一个维度的元素并不总是单值,有时候是一个数组或矩阵等等,这时候就要在对应位置上再进行求和、比较大小等等。

如果你不想知道其原理,简单的记作:axis=0表示对行(上下)进行操作计算,axis=1(左右)表示对列进行操作计算,也是没有问题的。

首先看一下什么叫做维度,一个矩阵的维度大家都知道是二维。包含行和列。

接着看下面这个数组a,这个数组可以看作是一个二维数组,每一维中又同时包含一个矩阵。运用下你的空间想象能力。所以这个数组是三维的。

>>> import numpy as np
>>> a = np.array([[[1,2,3,2],[1,2,3,1],[2,3,4,1]],[[1,0,2,0],[2,1,2,0],[2,1,1,1]]])
>>> a
array([[[1, 2, 3, 2],
        [1, 2, 3, 1],
        [2, 3, 4, 1]],

       [[1, 0, 2, 0],
        [2, 1, 2, 0],
        [2, 1, 1, 1]]])

由下面我们可以看到a的维度是3,其实有个简便的看法,你看小括号旁有几个中括号 [ 就是几维,简单吧。

>>> a.ndim
3
>>> a.shape
(2, 3, 4)

当我们想要定位到某个元素时,需要表示为 a [ i ] [ j ] [ k ] a[ i ][ j ][ k ] a[i][j][k],容易理解,三维所以需要三层括号。其中 i 表示第一维,j 表示第二维,k 表示第三维。

axis取多少,就表明在哪个维度上求和。

  • axis=None 表示对所有元素求和。
  • axis=0 表示在第1个维度上求和。
  • axis=1 表示在第2个维度上求和。
  • 以此类推…

二维数组

让我们从简单的开始,先来看二维数组的求和,假设有一个2x2的矩阵b,也就是一个二维数组。第一个维度包含两个数组,每个数组包含两个值。

>>> b = np.array([[1, 2], [2, 3]])
>>> b
array([[1, 2],
       [2, 3]])
>>> b.shape
(2, 2)

axis=0时,表示在第1个维度上求和,也就是在第一个维度上的元素间的求和。在这里也就是行与行之间进行求和。因为第一个维度中包含两个数组,这两个数组也就是矩阵的两行,发挥你的想象力。接着我们来算一下,行与行之间进行求和,首先是第一行的第一个元素与第二行的第一个元素求和(1+2)=3,然后是(2+3)=5。有下面可以看到计算正确。且可以看到输出的shape是(1,2),也就是一行两列。注意这一点,后面会继续说明。直观理解是对列进行求和。

>>> np.sum(b,axis=0)
array([3, 5])
>>> np.sum(b,axis=0).shape
(2,)

如果我们用公式来表达呢:
s [ j ] = ∑ i = 1 2 b [ i ] [ j ] − − j ∈ ( 1 , 2 ) s[j]=\sum_{i=1}^2b[i][j]--j\in(1,2) s[j]=i=12b[i][j]j(1,2)
好理解吗?当你习惯后,你会发现用公式会比直觉好理解的多,且更容易泛化。当数据是高维的时候,你的直觉可能就不够用了,这时用公式你会发现会非常简单。 i i i 表示第一个维度,axis=0表示在第一个维度上进行求和,所以公式表达就是对 i i i 进行求和, j j j 为结果的索引。所以最后的输出的shape是删掉了第一个维度的shape,这里删掉了2,结果的shape是(1,2),也就是一行两列。好好理解公式。

axis=1 时,在第二个维度上进行求和,是第二个维度的元素间的求和。在这里也就是列之间的求和,首先是(1+2)=3,然后(2+3)=5。

>>> np.sum(b,axis=1)
array([3, 5])

公式,对 j j j 进行求和, i i i不变:
s [ i ] = ∑ j = 1 2 b [ i ] [ j ] − − i ∈ ( 1 , 2 ) s[i]=\sum_{j=1}^2b[i][j]--i\in(1,2) s[i]=j=12b[i][j]i(1,2)

三维数组

当我们熟悉公式后,计算高维数据就不用直觉来推了,直接套公式。 a [ i ] [ j ] [ k ] a[ i ][ j ][ k ] a[i][j][k]

axis=0 i i i 进行求和,其余为结果的索引。求和公式为:
s [ j , k ] = ∑ i = 1 a [ i ] [ j ] [ k ] s[j,k]=\sum_{i=1}a[i][j][k] s[j,k]=i=1a[i][j][k]
输出的shape自然也就是去掉 i i i 的,为(j, k),这里就是(3,4)

例如s[1,1]=(1+1)=2,结果正确,其余的可以自己验算。

>>> np.sum(a,axis=0)
array([[2, 2, 5, 2],
       [3, 3, 5, 1],
       [4, 4, 5, 2]])
>>> np.sum(a,axis=0).shape
(3, 4)

axis=1,对 j j j 进行求和,直接把上面的公式中的 i i i 改为 j j j 就行了。求和公式为:
s [ i , k ] = ∑ j = 1 a [ i ] [ j ] [ k ] s[i,k]=\sum_{j=1}a[i][j][k] s[i,k]=j=1a[i][j][k]
还要注意输出的shape等于原来的减去 j j j的,也就是(2,4)

>>> np.sum(a,axis=1)
array([[ 4,  7, 10,  4],
       [ 5,  2,  5,  1]])
>>> np.sum(a,axis=1).shape
(2, 4)

axis=2就不写了,与上面同理。

axis为元组

还有一个问题,上面讨论的是axis取值为单值的情况,当axis等于一个元组的时候呢?例如axis=(0,1)

其实和上面是一样的道理,axis等于什么,就在公式中对什么求和就行了,例如axis=(0,1),也就是在第一个维度和第二个维度上进行求和,公式中就是对 i i i , j j j , 进行求和,其余的则是结果的索引。

公式:
s [ k ] = ∑ i = 1 ∑ j = 1 a [ i ] [ j ] [ k ] s[k]=\sum_{i=1}\sum_{j=1}{a[i][j][k]} s[k]=i=1j=1a[i][j][k]
输出的shape为原来的shape减去 i 和 j 的shape就行

>>> np.sum(a,axis=(0, 1))
array([ 9,  9, 15,  5])
>>> np.sum(a,axis=(0, 1)).shape
(4,)

对三维数组a来说,axis=(0,1,2)也就等于axis=None,对所有元素进行求和。

那么对于高位数组,同样也只要套公式就行了。

刚开始看可能有点绕,有任何问题可以留言交流。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值