【问题标题】:What does axis = 0 do in Numpy's sum function?在 Numpy 的 sum 函数中,axis = 0 做了什么?
【发布时间】:2016-10-23 06:03:54
【问题描述】:

我正在学习Python,遇到了numpy.sum。它有一个可选参数axis。此参数用于获取按列求和或按行求和。当axis = 0 我们暗示只对列求和。例如,

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

这段代码的 sn-p 产生输出:array([5, 7, 9]),很好。但如果我这样做:

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

我得到结果:6,这是为什么呢?我不应该得到array([1, 2, 3])吗?

【问题讨论】:

  • 至于您的问题,它是在第一个(也是唯一一个)轴上求和。一维数组中没有“列”的概念。
  • 对于 2021 年的读者来说,唯一的真相在这里:stackoverflow.com/a/41733570/5290519

标签: python arrays numpy


【解决方案1】:

如果有人需要这个视觉描述:

【讨论】:

    【解决方案2】:

    所有正在发生的事情是 numpy 在第一个(第 0 个)和唯一的轴上求和。考虑以下几点:

    In [2]: a = np.array([1, 2, 3])
    
    In [3]: a.shape
    Out[3]: (3,)
    
    In [4]: len(a.shape) # number of dimensions
    Out[4]: 1
    
    In [5]: a1 = a.reshape(3,1)
    
    In [6]: a2 = a.reshape(1,3)
    
    In [7]: a1
    Out[7]: 
    array([[1],
           [2],
           [3]])
    
    In [8]: a2
    Out[8]: array([[1, 2, 3]])
    
    In [9]: a1.sum(axis=1)
    Out[9]: array([1, 2, 3])
    
    In [10]: a1.sum(axis=0)
    Out[10]: array([6])
    
    In [11]: a2.sum(axis=1)
    Out[11]: array([6])
    
    In [12]: a2.sum(axis=0)
    Out[12]: array([1, 2, 3])
    

    所以,更明确地说:

    In [15]: a1.shape
    Out[15]: (3, 1)
    

    a1 是二维的,“长”轴是第一个。

    In [16]: a1[:,0] # give me everything in the first axis, and the first part of the second
    Out[16]: array([1, 2, 3])
    

    现在,沿第一个轴求和:

    In [17]: a1.sum(axis=0)
    Out[17]: array([6])
    

    现在,考虑一个不那么简单的二维情况:

    In [20]: b = np.array([[1,2,3],[4,5,6]])
    
    In [21]: b
    Out[21]: 
    array([[1, 2, 3],
           [4, 5, 6]])
    
    In [22]: b.shape
    Out[22]: (2, 3)
    

    第一个轴是“行”。 沿行求和:

    In [23]: b.sum(axis=0)
    Out[23]: array([5, 7, 9])
    

    第二个轴是“列”。 沿列求和:

    In [24]: b.sum(axis=1)
    Out[24]: array([ 6, 15])
    

    【讨论】:

    • TLDR:axis 是要折叠为单个值的维度。 axis=0 ==> rows ==> collapse rows 因此我们执行列求和(将每列中的所有值相加),每列留下一个值。 axis=1 ==> columns 所以我们进行行求和(将每行中的所有值相加),这样每行就剩下一个值。对于一维数组,只有 1 个轴 (0),因此通过执行传统的求和,单个轴会折叠为一个值。
    • 不是axis=1 沿行求和,axis=0 沿列求和吗?
    【解决方案3】:

    np.sum(a, axis=i) 中的轴 i 是该数组形状的第 i 个索引(从零开始)。

    让我们试着通过一些例子来理解这意味着什么:

    a = np.array([1, 2, 3])
    print (a.shape) #prints (3,) 
    #so axis = 0 corresponds to 3 and axis = 1 corresponds to nothing
    

    让我们看看axis = 0和axis = 1对总和做了什么:

    sum = np.sum(a, axis=0) #sum = 6
    

    因此,sum = np.sum(a, axis=0) 将汇总 a.shape 的第 0 个索引所指的所有数字,在本例中为 3 个数字。由于默认情况下 numpy 数组是行优先的(这只是另一种说法,即在列索引之前指定行索引),因此 axis=0 将对形状所指的三个数字求和。

    sum = np.sum(a, axis=1) #gives an error
    

    同样,np.sum(a, axis=1) 应该将 np.shape 的第一个索引所指的所有数字相加,但由于没有形状的第一个索引,我们会得到错误。

    我们再举一个例子:

    b = np.array([[1,2,3],
                 [4,5,6]])
    print(b.shape) #prints (2,3)
    #axis = 0 corresponds to 2 and axis = 1 corresponds to 3
    

    现在,让我们看看改变轴的作用:

    sum = np.sum(b, axis=0) #sum = [5, 7, 9] of shape(3,)
    

    我们知道 axis = 0 应该沿着形状的第一个索引求和,我们希望它沿着这个轴找到两个数字(通过查看形状)。所以[1+4, 2+5, 3+6]

    sum = np.sum(b, axis=1) #sum = [6, 15] of shape(2,)
    

    现在总和沿轴 = 1,从形状上我们可以看到它是一个轴,沿该轴有 3 个数字相加。所以,[1+2+3,4+5+6]

    【讨论】:

    • 轴的解释和含义很好!
    【解决方案4】:

    只是为了更方便地使用 np.sum(a, axis) 来处理多维数组。如果沿轴求和,则生成的形状将该轴作为 1。这就是我的意思;

     a1.shape = 2x3
     sum1 = a1.sum(axis=0)
     sum1.shape will be 1x3
    
    sum2 = a1.sum(axis=1)
    sum2.shape will be 2x1
    

    从这里你知道形状为 2x3x4x... 沿轴 0 的总和是 1x3x4x...

    【讨论】:

      【解决方案5】:

      axis是数组索引的索引。 数组索引从0开始,从右到左计数。

      因此, np.sum(a, axis = 0) 表示沿着最右边的索引求和。

      【讨论】:

        【解决方案6】:

        axis=0 表示其他轴是固定的,只有axis=0 是动态的。

        a = np.array([[1, 2, 3], [4, 5, 6]])
        sum(a[:,0]) => 5
        sum(a[:,1]) => 7
        sum(a[:,2]) => 9
        np.sum(a,axis=0) => [5,7,9]
        

        如果对形状为 (2, 3) 的矩阵求和,则得到形状为 (3, ) 的矩阵。

        a = np.array([[1], [2], [3]])
        sum(a[:,0]) => [6]
        np.sum(a,axis=0) => [6]
        

        如果对一个形状为(3, 1)的矩阵求和,则得到一个形状为(1, )的矩阵。

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

        如果对一个形状为(1, 3)的矩阵求和,则得到一个形状为(3, )的矩阵。

        a = np.array([1, 2, 3])
        sum(a[:]) => 6
        np.sum(a,axis=0) => 6
        

        如果对 shape(3, ) 的矩阵求和,则得到一个数字。

        【讨论】:

          猜你喜欢
          • 2021-01-09
          • 1970-01-01
          • 2022-07-15
          • 1970-01-01
          • 2019-06-29
          • 2011-03-11
          • 1970-01-01
          • 2020-06-10
          • 1970-01-01
          相关资源
          最近更新 更多