对NumPy中axis参数的讨论

对NumPy中axis参数的理解

NumPy是用Python进行数据分析时不可缺少的数值计算包,而axis参数经常出现在这个包中的许多方法中。

先看一个例子:

In [54]: arr = np.random.randn(5,4)

In [55]: arr.sum(axis=0)
Out[55]: array([-0.78235764, -0.05712849, -3.87703455,  1.51758567])

In [56]: arr.sum(axis=1)
Out[56]: array([-0.51765783, -2.78973184,  0.73440357,  0.45910145, -1.08505038])

In [57]: arr
Out[57]: 
array([[-0.2516431 , -0.53666054, -1.32276913,  1.59341494],
       [-1.4617129 , -0.7254091 , -1.24477145,  0.64216161],
       [ 0.92642389, -0.05923635,  0.2533471 , -0.38613107],
       [ 0.98947857,  1.35354527, -1.3807973 , -0.5031251 ],
       [-0.98490411, -0.08936778, -0.18204378,  0.17126529]])

粗看起来可能没什么问题,但仔细观察会发现:axis=0时,输出是4个元素的一维向量,与原矩阵的第二个(第1个)维度相同;axis=1时,输出是5个元素的一维向量,与原矩阵的第一个(第0个)维度相同。令人混淆。

更一般的,对于一个更高维矩阵:

In [37]: arr = np.ones([2,3,4])

In [38]: arr
Out[38]: 
array([[[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]],

       [[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]]])

In [39]: arr.sum(1)
Out[39]: 
array([[3., 3., 3., 3.],
       [3., 3., 3., 3.]])

In [40]: arr.sum(0)
Out[40]: 
array([[2., 2., 2., 2.],
       [2., 2., 2., 2.],
       [2., 2., 2., 2.]])

In [41]: arr.sum(2)
Out[41]: 
array([[4., 4., 4.],
       [4., 4., 4.]])

我们有类似的规律:axis=0时,输出矩阵维度与(axis=1, axis=2)相同,axis=1时,输出矩阵维度与(axis=0, axis=2)相同,axis=2时,输出矩阵维度与(axis=0, axis=1)相同。

个人认为可以这么理解:

对于含有axis参数的方法,(可能)都是在对某个指定的维度操作,例如对于一个二维矩阵,sum()是在对每一行(或每一列)求和,这样的结果就自然而然的比原始矩阵少一个维度。少的这个维度,就是参数axis指定的那个维度

对于最特殊也最常处理的二维矩阵而言,axis=0时是按列处理,指定的是列维,处理后列维消失,剩余行维;axis=1时是按行处理,指定的是行维,处理后行维消失,剩余列维。

posted @ 2021-10-04 09:57  Baoding_LIU  阅读(92)  评论(0)    收藏  举报