使用Python中的Numpy和Pandas进行数据分析的时候,经常会遇到axis参数,网络上很多资料对这个基本问题说得不清楚,现结合自己的理解来讲讲axis本质,希望大家多多批评指正。
axis用在对多维数组进行操作时指定变化的是哪一维?(一维数组因为只有一个维度,不需要指定哪一维)指定axis=n进行某种操作时,如进行sum操作,表示其它维相对固定的情况下,对标号为n的那一维上的所有数进行一次sum操作,然后在其它维上不断遍历的情况下,重复进行sum操作,假设数组原本有M维,最后将变成M-1维,标号为n的那一维最后被消除了。
接下来看几个具体的例子。
arr1 = np.array(
[[ 11,2,3,4],
[ 5, 6,7,18],
[ 9, 8,1,3]])
print(np.min(arr1,axis=0))
print(np.max(arr1,axis=1))
arr1是一个二维数组,标号为0的维代表行,标号为1的维代表列。语句np.min(arr1,axis=0)里axis=0代表:先把其他维(这里只剩下标号为1的维度)固定为0,即固定第一列,变化的是标号为0的维上的下标,对三个数11,5,9求最小值为5;然后固定第二列,再次变化标号为0的维上的下标,对三个数2,6,8求最小值为2;依此类推,然后固定第三列,在对应的列上,求出最小值为1;在最后一列上求出最小值为3。
语句np.max(arr1,axis=1),axis=1代表:这里的其他维是指标号为0的维,先将它固定为0,也就是固定为第一行,变化的是标号为1的维上的下标,对四个数11,2,3,4求最大值,求出最大值为11;然后固定为第二行,再次变化标号为1的维上的下标,对二行的四个数5, 6,7,18求最大值为18;依此类推,固定为第三行,对9, 8,1,3这四个数求最大值为9。
再看一个更具有代表性的例子
import numpy as np
arr1 = np.array(
[[[11,2, 3, 4],
[ 5, 16,7, 18],
[ 9, 8, 1, 3]]
,
[[1, 5, 13,4],
[ 15,6, 9, 2],
[ 9, 18,11,3]]]
)
print(np.min(arr1,axis=0))
print(np.max(arr1,axis=1))
arr1是一个三维数组,可以想像为一个2页,每页3行4列的数组,下标为0的维控制各页,下标为1的维控制各行,下标为2的维控制各列。 np.min(arr1,axis=0)里的axis=0代表:其它维的下标为1和2,当其它维暂时固定时,变化的是各页上的数。其它维先固定为第一行第一列,遍历该位置上各页的数为11和1,最小值为1。然后其它维再固定为第一行第二列,遍历该位置上各页的数为2和5,最小值为2。依此类推得到的最终结果为:
[[1 2 3 4]
[5 6 7 2]
[9 8 1 3]]
np.max(arr1,axis=1)里的axis=1代表:其它维的下标为0和2,当其它维暂时固定时,也就是固定页和列时,变化的是各行上的数。先固定为第一页与第一列,在变化的行的维度上有三个数11,5,9,最大值为11。再固定为第一页与第二列,在变化的行的维度上有三个数2,16,8 ,最大值为16。依此类推把第一页处理完后,再固定为第二页与第一列,在1,15,9这三个数中求出最大值为15。依此类推得到的最终结果为:
[[11 16 7 18]
[15 18 13 4]]
同理np.argmin(arr1,axis=0),np.argmax(arr1,axis=1)这两条语句的执行过程与上面分析的两条语句的执行过程是一样的,不同之处在于得到的结果为:求得的最小值在指定的变化维上的下标。如下所示:
[[1 0 0 0]
[0 1 0 1]
[0 0 0 0]]
[[0 1 1 1]
[1 2 0 0]]