Numpy库中对axis(轴)的详解


前言

提示:今天更新一个小知识点,是关于numpy里面一个关键词(axis),作为刚接触不久的我来说可以说是增加见识了。起初我也是对这个关键词也是半懂不懂,二维的数组还搞得来,但是到高维数组的时候就是“我是谁,我在哪儿”这种状态了,通过看一些大佬的博客和学习官方文档,于是有一点感受,所以呢在这里向大家分享一下。


提示:以下是本篇文章正文内容,下面案例可供参考

一、Numpy中asix是什么?

我们都知道Numpy是用来对多维数组对象和用于处理数组例程集合进行操作的库。那么对于高维的数组进行数组处理时难免会遇到对数据元素进行索引,增加,排序等操作问题,为了更好的流畅的表达对数据元素的操作,就引入了—>轴(axis)
在官方手册里面定义的是:轴是为具有多个维度的数组定义的二维数组有两个对应的轴:第一个垂直向下穿过行(axis0),第二个轴水平穿过列(axis1)

然后就是高维数组中关于axis(i)的问题,按照个人理解就是这个i表示是一个维度,什么意思呢,如果有一个三位的数组array([ [[4, 2, 0], [0, 0, 4]], [[2, 1, 1],[1, 0, 2]], [[3, 0, 4],[0, 1, 3]] ]),axis(0)表示三维数组里面的二维子部分,axis(1)表示二维子部分的一维子部分,axis(2)表示一维子部分的内部元素。就是由表及里的深入。后边通过例子说明这一点。

还有就是如过多维数组是个方阵 A ( n ∗ n ) A_(n*n) A(nn),那么i<=n-1。

二、二维数组中axis的作用

OK,我们先来看一个demo,直观感受一下

# 创建一个二维数组
a = np.array([[6, 3], [4, 1]])
print('原数组:')
print(a)
print('对轴0排序后的数组:')
print(np.sort(a, axis=0))
print('对轴1排序后的数组:')
print(np.sort(a, axis=1))

输出结果

原数组:
[[6 3]
 [4 1]]
对轴0排序后的数组:
[[4 1]
 [6 3]]
对轴1排序后的数组:
[[3 6]
 [1 4]]

接下来讲原理:上面我们说过axis(0)是垂直向下穿过行,怎么理解呢。首先搞明白一点,“垂直穿过行”是不是就是意味着单次运行时,行是变化的,列是不变的。所以我们通过数组下标来理解就是a[0,0]–>a[1,0]、a[0,1]–>a[1,1]对应就是6和4,3和1比大小,然后就是输出排序后的结果了;当axis(1)是轴水平穿过列则可以表示行不变,列在变化,反映在上面的二维数组上面就是a[1,0]–>a[1,1],然后就是对应的数组元做比较再输出了。同时这个也就反映了一个问题就是我刚刚上面说的维度问题。如果将a[0,0], a[1,0]看做成列表,可以看到变化的是索引位置为0的位置,当axis(0)时按照多维数组A看做成一维数组的情况的说法就是变化A[0]–>A[1]。就是说有一个三维数组B,则axis表示维度就可以理解为B[axis(0),axis(1),axis(2)],什么意思呢,就是对高维数组进行操作时当轴定义为axis(0)时,数组下标变化的就是B[变化,不变,不变];轴定义为axis(1)时数组下标变化就是B[不变,变化,不变];轴定义为axis(2)时下标变化就是B[不变,不变,变化]
结合到例子就是下面这个demo这样了。

二、多维数组中axis的作用

1.多维数组中元素按指定轴进行排序

代码如下(示例):

data = np.random.randint(0, 5, [3,2,3])
>>> data
array([[[4, 2, 0],
        [0, 0, 4]],

       [[2, 1, 1],
        [1, 0, 2]],

       [[3, 0, 4],
        [0, 1, 3]]])
>>> np.sort(data)  # 默认对最大的axis进行排序,这里即是axis=2
# 举个例子数组下标变化的例子就是有data[0,0,0]->data[0,0,1]->data[0,0,2]变为
#                                data[0,0,2]->data[0,0,1]->data[0,0,0]
array([[[0, 2, 4],
        [0, 0, 4]],

       [[1, 1, 2],
        [0, 1, 2]],

       [[0, 3, 4],
        [0, 1, 3]]])
>>> np.sort(data, axis=0)  # 沿着第0维进行排序,
# 原先的data[0,0,0]->data[1,0,0]->data[2,0,0]转变为
#       data[1,0,0]->data[2,0,0]->data[0,0,0]
array([[[2, 0, 0],
        [0, 0, 2]],

       [[3, 1, 1],
        [0, 0, 3]],

       [[4, 2, 4],
        [1, 1, 4]]])
>>> np.sort(data, axis=1)  # 沿着第1维进行排序,
# 原先的data[0,0,0]->data[0,1,0],data[0,0,1]->data[0,1,1],data[0,0,2]->data[0,1,2]分别变为
#       data[0,1,0]->data[0,0,0], data[0,1,1]->data[0,0,1],data[0,0,2]->data[0,1,2]
array([[[0, 0, 0],
        [4, 2, 4]],

       [[1, 0, 1],
        [2, 1, 2]],

       [[0, 0, 3],
        [3, 1, 4]]])
>>> np.sort(data, axis=2)  # 沿着第2维进行排序
array([[[0, 2, 4],
        [0, 0, 4]],

       [[1, 1, 2],
        [0, 1, 2]],

       [[0, 3, 4],
        [0, 1, 3]]])
>>> np.sort(data, axis=None)  # 对全部数据进行排序
array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4])

所以,可以总结为一句话:设有axis(i),则numpy沿着数组第i个下标变化的方向进行操作

2.多维数组按照axis指定的轴进行拼接

在官方的文档中有一个concatenate函数,可用于数组的拼接。
定义如下:
numpy.concatenate(( a 1 , a 2 , . . . a n a_1,a_2,...a_n a1,a2,...an),axis=i)
按照上面所说的维度解释列举一个demo
代码如下:
代码如下(示例):

a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b = np.array([[9, 8, 7], [6, 5, 4], [3, 2, 1]])

c = np.concatenate((a, b), axis=0)
print(c, '\n')
d = np.concatenate((a, b), axis=1)
print(d, '\n')

输出如下:

[[1 2 3]
 [4 5 6]
 [7 8 9]
 [9 8 7]
 [6 5 4]
 [3 2 1]] 
 
[[1 2 3 9 8 7]
 [4 5 6 6 5 4]
 [7 8 9 3 2 1]] 

在这里还是那句话:第一个垂直向下穿过行(axis0),第二个轴水平穿过列(axis1)。


总结

这次的小知识点总结就到这里了,以后陆续更新一些知识点以及上篇博客机器学习之梯度下降算法所说的有关机器学习的算法,欢迎大家讨论。

猜你喜欢

转载自blog.csdn.net/weixin_43872709/article/details/109004100