分享

numpy中axis参数说明和数组轴的理解...

 iceer1212 2022-08-23 发布于广东

大纲:

  • numpy中axis参数说明:
    axis=i,即沿着数组第i个下标的变化方向进行操作。
  • 关于NumPy中数组轴的理解:
    学好数据分析,得学好Numpy;学好Numpy,首先彻底理解“轴”的概念!

一、numpyaxis参数

背景:

       许多关于计算整个数组统计值或关于轴向数据的数学函数,可以作为数组类型的方法被调用。你可以使用聚合函数(通常也叫缩减函数),比如sum、mean。像这样的函数可以接收一个可选参数axis,这个参数可以用于计算给定轴向上的统计值,形成一个下降一维度的数组。

这里我们用numpy.sum(axis=i)进行说明

举例说明:

k = np.reshape(np.arange(24), [3, 2, 4])
print(k)

[[[ 0  1  2  3]
  [ 4  5  6  7]]

 [[ 8  9 10 11]
  [12 13 14 15]]

 [[16 17 18 19]
  [20 21 22 23]]]

这是一个(3,2,4)维的矩阵,那么对于每个元素,均可用3个下标i,j,k表示,如:

k[i][j][k]
k[0][0][0]=0
k[0][0][3]=3
k[0][1][0]=4
k[1][0][0]=8
k[2][1][3]=23


# 坐标轴的取值范围
i={0,1,2}
j={0,1}
k={0,1,2,3}

轴的概念:

求和属于聚合函数,操作是降维操作。数组k有三个轴分别是I,J,K轴,这三个轴也分别叫第0轴、第1轴和第2轴。分别按照这三个轴进行求和:

axis=0

axis=0,即沿着第0个轴i下标变化的方向进行求和,第0轴降维,得到的shape=(2,4)
  原规模为3x2x4的三维数组,将3变为1,降成了规模为2x4的二维数组。

print(k.sum(axis=0))
print(k.sum(axis=0).shape)

[[24 27 30 33]
 [36 39 42 45]]
(2, 4)

通过手算,沿着第0个坐标遍历求和,解释上面输出结果的由来,:

# 沿着第三个坐标 k=0,1,2,3,再沿着第二个坐标j=0,1,共计算8次
# 坐标轴的取值范围
# i={0,1,2}
# j={0,1}
# k={0,1,2,3}

k[0][0][0]+k[1][0][0]+k[2][0][0]=24
k[0][0][1]+k[1][0][1]+k[2][0][1]=27
k[0][0][2]+k[1][0][2]+k[2][0][2]=30
k[0][0][3]+k[1][0][3]+k[2][0][3]=33

k[0][1][0]+k[1][1][0]+k[2][1][0]=36
k[0][1][1]+k[1][1][1]+k[2][1][1]=39
k[0][1][2]+k[1][1][2]+k[2][1][2]=42
k[0][1][3]+k[1][1][3]+k[2][1][3]=45

sum = np.reshape(np.array([24, 27, 30, 33, 36, 39, 42, 45]), (2, 4))
sum = array([[24, 27, 30, 33],
             [36, 39, 42, 45]])

axis=1

axis=1,即沿着第1个坐标下标j变化的方向进行求和,第1轴降维,得到的shape=(3,4)
  原规模为3x2x4的三维数组,将2变为1,降成了规模为3x4的二维数组。

print(k.sum(axis=1))
print(k.sum(axis=1).shape)

[[ 4  6  8 10]
 [20 22 24 26]
 [36 38 40 42]]
(3, 4)

这时,我们沿着第1个坐标j进行手动求和,按步骤解释上面输出结果的由来:

# 坐标轴的取值范围
# i={0,1,2}
# j={0,1}
# k={0,1,2,3}

k[0][0][0]+k[0][1][0]=4
k[0][0][1]+k[0][1][1]=6
k[0][0][2]+k[0][1][2]=8
k[0][0][3]+k[0][1][3]=10

k[1][0][0]+k[1][1][0]=20
k[1][0][1]+k[1][1][1]=22
k[1][0][2]+k[1][1][2]=24
k[1][0][3]+k[1][1][3]=26

k[2][0][0]+k[2][1][0]=36
k[2][0][1]+k[2][1][1]=38
k[2][0][2]+k[2][1][2]=40
k[2][0][3]+k[2][1][3]=42

sum = np.reshape(np.array([4, 6, 8, 10, 20, 22, 24, 26, 36, 38, 40, 42]), (3, 4))
sum = array([[ 4,  6,  8, 10],
             [20, 22, 24, 26],
             [36, 38, 40, 42]])

axis=2

当axis=2,即沿着第2个坐标下标k变化的方向进行求和,第2轴降维,得到的shape=(3,2):
  原规模为3x2x4的三维数组,将4变为1,降为了规模为3x2 的二维数组。

print(k.sum(axis=2))
print(k.sum(axis=2).shape)

[[ 6 22]
 [38 54]
 [70 86]]
(3, 2)

还是一样的,我们沿着k坐标的变化进行计算,解释输出结果:

# 坐标轴的取值范围
# i={0,1,2}
# j={0,1}
# k={0,1,2,3}

k[0][0][0]+k[0][0][1]+k[0][0][2]+k[0][0][3]=6
k[0][1][0]+k[0][1][1]+k[0][1][2]+k[0][1][3]=22

k[1][0][0]+k[1][0][1]+k[1][0][2]+k[1][0][3]=38
k[1][1][0]+k[1][1][1]+k[1][1][2]+k[1][1][3]=54

k[2][0][0]+k[2][0][1]+k[2][0][2]+k[2][0][3]=70
k[2][1][0]+k[2][1][1]+k[2][1][2]+k[2][1][3]=86

sum = np.reshape(np.array([6, 22, 38, 54, 70, 86]), (3, 2))
sum = array([[ 6, 22],
             [38, 54],
             [70, 86]])

二、NumPy中的数组轴

学好数据分析,得学好Numpy;学好Numpy,首先彻底理解“轴”的概念!

1. 在二维NumPy数组中,轴是沿行和列的方向

在这里插入图片描述

  1. AXIS 0 轴是沿着行(rows)的方向
    在NumPy数组中,axis 0 是第一轴。对于二维或多维数组,axis 0 是沿行(row)向下的轴。(一维数组是特例,不适用此处解释,后续讲解)
    在这里插入图片描述

  2. AXIS 1 轴是沿着列(columns)的方向
    在NumPy数组中,axis 1 是第2根轴。对于二维或多维数组,axis 1 是沿列(columns)横穿的轴。
    在这里插入图片描述

2. 二维或多维数组中axis参数控制的内容

在带有axis参数的二维数组上使用np.sum()等聚合函数时,它会将二维数组折叠为一维数组。它会折叠数据并减少维度。

axis参数控制将聚合哪个轴,换句话说,axis参数控制哪个轴将被折叠。

将NumPy和函数与axis参数一起使用时,指定的轴是折叠的轴。

示例,先创建一个简单的数组:

k = np.reshape(np.arange(6), [2, 3])
print(k)

[[0 1 2]
 [3 4 5]]

解析:

数组k的规模是2*3的二维数组 。下面:
分别使用 axis= 0 和 axis= 1 的NumPy求和函数sum:

  1. axis=0:0轴降维。原数组K由2x3的二维数组降为1x2的一维数组。
  2. axis=1:1轴降维。原数组K由2x3的二维数组降维为2x1的一维数组,写成1x2的数组。

举例:

k0 = np.sum(k, axis=0)
print(k0)

k1 = np.sum(k, axis=1)
print(k1)

[3 5 7]
[ 3 12]

在这里插入图片描述

3. 一维NumPy数组中的axis

一维NumPy数组只有一个轴(即axis=0)
在这里插入图片描述
示例:连接1-D阵列(一维数组)

import numpy as np
k0 = np.array([1, 1, 1])
k1 = np.array([2, 2, 2])
print(k0, k1)

k = np.concatenate([k0, k1], axis=0)
print(k)

[1 1 1] [2 2 2]
[1 1 1 2 2 2]

示例:用AXIS = 1连接1-D阵列时的报错

import numpy as np
k0 = np.array([1, 1, 1])
k1 = np.array([2, 2, 2])
print(k0, k1)

k = np.concatenate([k0, k1], axis=1)
print(k)


[1 1 1] [2 2 2]
Traceback (most recent call last):
  File "D:/**/**/**.py", line 6, in <module>
    k = np.concatenate([k0, k1], axis=1)
  File "<__array_function__ internals>", line 6, in concatenate
numpy.AxisError: axis 1 is out of bounds for array of dimension 1

参考资料:

作者:yoshino 链接:https://www.jianshu.com/p/25e3d216e5bd
作者:ElonJiang 链接:https://www.cnblogs.com/ElonJiang/p/11626851.html
《利用Python进行数据分析》4.3.2 数学和统计方法

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多