numpy中sum()中axis参数的问题

这篇博客探讨了numpy的sum()函数中axis参数的使用。通过一个三维例子,解释了当axis设为0时,计算的是最高维度的和,对应二维时的列和;而axis设为1时,则计算次维度的和,对应二维时的行和。这有助于更好地理解和应用sum()函数。

sum()中axis参数的问题:

在选定特定的轴后,sum得到的值维度降低一维

axis的值是shape返回元组的索引,
比如axis=0 是 最高维度 最外层括号
axis = 1:是第二层括号
axis = n是最内层括号 <==> axis =-1

     # sum() axis=n 表示以第n维为主元
 #以二数组为例:
    A = np.array([[1,2,3,4],[5,6,7,8]])
    Out[45]: 
    array([[1, 2, 3, 4],
           [5, 6, 7, 8]])
    A.sum(axis=1) # 返回一维
 #主要变的是列:
 #看索引值
 '''
     行为0时,列为0,1,2 相加的和为 位置 0的值
     行为1时,列为0,1,2 相加的和为 位置 1的值
     行为2时,列为0,1,2 相加的和为 位置 2的值
     也就是: add A[i,j]     for j in range(0,A.shape[1])
     '''

    #array([10, 26])


    # 计算结果与A.sum(axis=1) 相同
    ls = []
    for i in range(0,A.shape[0]):
       ls.append( sum(A[i]) )
'''
同样当axis=0时,主要变化的是行
    列为0时,行为0,1,2 相加的和为 位置 0的值
    ... ...
  '''

看三维的列子

x= np.array([[[ 0,  1,  2],
    [ 3,  4,  5],
    [ 6,  7,  8]],
   [[ 9, 10, 11],
    [12, 13, 14],
    [15, 16, 17]],
   [[18, 19, 20],
    [21, 22, 23],
    [24, 25, 26]]])

 x.shape #(3, 3, 3)

axis = 0 #得到的值为二维
 for j in range(0, x.shape[1]):
      for k in range(0, x.shape[2]):
        print( "element = ", (j,k), " ", [ x[i,j,k] for i in range(0, x.shape[0]) ])
...
#最高维为主要变化的量,

#第二维和第三维为 0, 0时,第一维为0,1,2 相加的和为 位置 0,0的值
#第二维和第三维为 0, 0时,第一维为0,1,2 相加的和为 位置 0, 1的值
#第二维和第三维为 0, 0时,第一维为0,1,2 相加的和为 位置 0, 2的值
'''

element =  (0, 0)   [0, 9, 18]             #sum is 27
element =  (0, 1)   [1, 10, 19]            #sum is 30
element =  (0, 2)   [2, 11, 20]
element =  (1, 0)   [3, 12, 21]
element =  (1, 1)   [4, 13, 22]
element =  (1, 2)   [5, 14, 23]
element =  (2, 0)   [6, 15, 24]
element =  (2, 1)   [7, 16, 25]
element =  (2, 2)   [8, 17, 26]
'''
x.sum(axis=0)            
array([[27, 30, 33],
       [36, 39, 42],
       [45, 48, 51]])

#axis = 1    
for i in range(0, x.shape[0]):
    for k in range(0, x.shape[2]):
        print( "element = ", (i,k), " ", [ x[i,j,k] for j in range(0, x.shape[1]) ])
#第一维和第三维为 0, 0时,第二维为0,1,2 相加的和为 位置 0,0的值
#第一维和第三维为 0, 0时,第二维为0,1,2 相加的和为 位置 0, 1的值
#第一维和第三维为 0, 0时,第二维为0,1,2 相加的和为 位置 0, 2的值
'''
element =  (0, 0)   [0, 3, 6]      #sum is 9 
element =  (0, 1)   [1, 4, 7]
element =  (0, 2)   [2, 5, 8]
element =  (1, 0)   [9, 12, 15]
element =  (1, 1)   [10, 13, 16]
element =  (1, 2)   [11, 14, 17]
element =  (2, 0)   [18, 21, 24]
element =  (2, 1)   [19, 22, 25]
element =  (2, 2)   [20, 23, 26]
'''
#对于sum函数而言,axis是第一个参数,我们可以省略关键词

x.sum(0), x.sum(1), x.sum(2)
(array([[27, 30, 33],
        [36, 39, 42],
        [45, 48, 51]]),
 array([[ 9, 12, 15],
        [36, 39, 42],
        [63, 66, 69]]),
 array([[ 3, 12, 21],
        [30, 39, 48],
        [57, 66, 75]]))`
所以在求二维行和时,列为主要变化量 sum([i,:]),故用sum(axis=1)
同理在求二维列和时,行为主要变化量 sum([:,i]), 故用sum(axis=0)
### NumPy 中 `axis` 参数的作用和用法 在 NumPy 库中,`axis` 参数用于指定沿哪个轴执行特定的操作。对于多维数组而言,理解 `axis` 是至关重要的,因为这决定了如何聚合或变换数据。 #### 一维数组上的应用 在一维情况下,由于只有一个方向的数据排列,因此通常不会涉及到 `axis` 参数的选择问题[^1]。 #### 多维数组中的表现形式 当处理二维及以上维度的数组时,`axis` 就变得尤为重要了。例如在一个形状为 (m,n) 的二维矩阵里: - 当 `axis=0` 表示沿着列的方向进行运算; - 而 `axis=1` 则意味着按照行来进行相应的计算; 这种模式同样适用于三维甚至更高维度的情况,只是随着维度增加,可能需要考虑更多的坐标轴选项[^2]。 #### 实际案例演示 为了更直观地展示这一点,可以通过创建一个简单的二维数组并对其求和来观察不同 `axis` 值的影响: ```python import numpy as np arr = np.array([[1, 2], [3, 4]]) sum_axis_0 = np.sum(arr, axis=0) # 结果将是 array([4, 6]) sum_axis_1 = np.sum(arr, axis=1) # 结果将会是 array([3, 7]) print("Sum along columns:", sum_axis_0) print("Sum across rows:", sum_axis_1) ``` 上述代码片段展示了如何利用 `axis` 来控制加总的方向——既可以是对每一列表项相加以获得每列之和(`axis=0`),也可以针对各行内的元素做累加得到各自行的结果 (`axis=1`)[^5]。 #### 函数兼容性 值得注意的是,并不是所有的 NumPy 函数都接受 `axis` 这样的参数,但对于那些确实提供了这一功能的方法来说(比如 `np.max()`、`np.min()` 或者 `np.mean()`),它们的行为逻辑遵循相同的规则:即根据给定的 `axis` 数值决定在哪条线上实施所请求的动作。 #### 特殊情况下的行为 如果输入是一个标量或者零维数组,则无论怎样设定 `axis` 都不会有实际意义,此时传递任何非负整数值作为 `axis` 可能会引起错误提示。另外,在某些特殊场景下,还可以传入元组类型的 `axis` 参数用来指示多个轴的同时作用范围[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值