对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时是按行处理,指定的是行维,处理后行维消失,剩余列维。

浙公网安备 33010602011771号