写在前面
我们知道axis这个东西经常出现在numpy的sum、argsort等一系列有关于数组的操作中,numpy中的轴axis是很重要的,许多numpy的操作根据axis的取值不同,作出的操作也不相同。可以说,axis让numpy的多维数组变的更加灵活,但也让numpy变得越发难以理解。因此,弄清楚axis的作用显得尤为重要。作为一个很基本同时很重要的概念,博主觉得很有必要详细深入了解一下这一名词。
下面把博主的一些发现分享给大家。
简单了解axis
axis 中文翻译指“轴”、“枢轴”。我们可以看一下英文官网的解释:
NumPy 的主要对象是同构多维数组。 它是一个元素表(通常是数字),所有类型都相同,由非负整数元组索引。 在 NumPy 中,维度称为轴。
例如,3D 空间 [1, 2, 1] 中一个点的坐标有一个轴。 该轴有 3 个元素,因此我们说它的长度为 3。在下图中的示例中,该数组有 2 个轴。 第一个轴的长度为 2,第二个轴的长度为 3。
[[1., 0., 0.],
[0., 1., 2.]]
实际上这个维度称为轴并不是很好理解,必须说明这里的轴维度和我们数学物理上面的是有很大区别的。
与数学物理方面的区别
我们现随机建立一个3×3的数组。
>>> import numpy as np
>>> np.random.rand(3, 3)
array([[0.14828241, 0.67698515, 0.22729984],
[0.78760285, 0.71820171, 0.43459394],
[0.85447318, 0.72708047, 0.56316259]])
该矩阵由于形状是3×3的,所以我们在线性代数里面认为这个矩阵维度是三(秩为三),但是在numpy的数组中,这个array的维数只有2,分别有axis=0,axis=1这两个轴,而axis=0的轴长度为3,axis=1的轴长度也为3.所以这里我们格外注意一下。
进一步理解
我们进行一下有关axis的操作,例如求和:
>>> c = np.arange(9).reshape(3,3)
>>> c
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> c.sum(axis=0)
array([ 9, 12, 15])
>>> c.sum(axis=1)
array([ 3, 12, 21])
>>>
这里可以看出,如果我们令axis=0,它会按照列求和得到一个和矩阵,令axis=1会得到一个按照行求和的矩阵。那么如果我们就这么记的话是不是就万事大吉了?当然不是!因为通常操作中,我们会操作维数更高的数组,这么的话,就无法使用0列1行的方法去操作了。
实际上,我们有着以下的规律:
设axis=i,则Numpy沿着第i个下标变化的方向进行操作
当然这里稍微补充一下如果是axis=-1的情况,那么就是沿着倒数第一个下标变化的方向开始操作
这里可以多举几个例子来帮助我们理解一下:
以以下三维数组为例:
>>> d = np.arange(24).reshape(3, 2, 4)
>>> d
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]]])
- 这是一个三维数组,若axis=0,那么我们就应该把d[0][i][j]+d[1][i][j]+d[2][i][j]加起来,最终得到一个形状为2×4的矩阵
>>> d
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]]])
>>> d.sum(axis=0)
array([[24, 27, 30, 33],
[36, 39, 42, 45]])
>>>
如图所示,确实得到了一个2×4的矩阵。
- 接着我们尝试axis=1,那么应该得到了一个3×4的矩阵
>>> d = np.arange(24).reshape(3, 2, 4)
>>> d
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]]])
>>> d.sum(axis=0)
array([[24, 27, 30, 33],
[36, 39, 42, 45]])
>>> d.sum(axis=1)
array([[ 4, 6, 8, 10],
[20, 22, 24, 26],
[36, 38, 40, 42]])
结果便是如此。
实际上除了sum函数,还有着许许多多需要用到这方面知识的函数,例如max、min、average、argsort、sort这些函数。
举几个我们看一下:
- sort
>>> e = np.random.randint(0, 20, 9).reshape(3, 3)
>>> e.sort()
>>> e
array([[ 3, 4, 4],
[ 9, 12, 14],
[ 4, 7, 7]])
>>> e.sort(axis=0)
>>> e
array([[ 3, 4, 4],
[ 4, 7, 7],
[ 9, 12, 14]])
>>> e.sort(axis=1)
>>> e
array([[ 3, 4, 4],
[ 4, 7, 7],
[ 9, 12, 14]])
- argsort
>>> f = np.random.randint(1, 20, 9).reshape(3, 3)
>>> f
array([[ 7, 4, 15],
[15, 17, 19],
[19, 15, 5]])
>>> f_sort = f.argsort()
>>> f_sort
array([[1, 0, 2],
[0, 1, 2],
[2, 1, 0]], dtype=int64)
>>> f_sort0=f.argsort(axis=0)
>>> f_sort0
array([[0, 0, 2],
[1, 2, 0],
[2, 1, 1]], dtype=int64)
>>> f_sort1=f.argsort(axis=1)
>>> f_sort1
array([[1, 0, 2],
[0, 1, 2],
[2, 1, 0]], dtype=int64)
参考链接:
-
https://zhuanlan.zhihu.com/p/31275071
-
https://blog.csdn.net/m0_37673307/article/details/82118030
-
https://stackoverflow.com/questions/19389910/in-python-numpy-what-is-a-dimension-and-axis#:~:text=In%20Numpy%20dimensions%20are%20called,has%20a%20length%20of%203.
-
https://numpy.org/doc/stable/user/quickstart.html#the-basics