numpy中对于axis的理解

写在前面

我们知道axis这个东西经常出现在numpy的sum、argsort等一系列有关于数组的操作中,numpy中的轴axis是很重要的,许多numpy的操作根据axis的取值不同,作出的操作也不相同。可以说,axis让numpy的多维数组变的更加灵活,但也让numpy变得越发难以理解。因此,弄清楚axis的作用显得尤为重要。作为一个很基本同时很重要的概念,博主觉得很有必要详细深入了解一下这一名词。
下面把博主的一些发现分享给大家。

简单了解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]]])
  1. 这是一个三维数组,若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的矩阵。

  1. 接着我们尝试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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值