在利用numpy、TensorFlow和Keras等进行编程时,经常发现很多函数携带axis参数,且具有相同功能的函数的axis(轴)参数取值范围可能不同(操作方式也不一样),从而引起一些困惑。针对这一问题,归纳总结如下:
1. Numpy函数中的axis参数理解
在Numpy中,axis的不同取值对应着numpy array的不同维度,通常取值范围是[-rank(input),rank(input))。比如,二维数组A = np.array([[1,2],[3,4]]),那么数组A的0轴(axis = 0)表示对应着A的第一维方向(纵轴),数组A的1轴(axis = 1)表示对应着A的第二维方向(横轴)。通过在numpy函数的输入参数中指定axis值,可以控制函数沿着axis轴指定的方向进行操作:
当numpy函数不指定axis的值时,表示函数对所有元素进行操作;
当numpy函数指定axis的值时,表示函数沿着指定的axis轴方向进行操作;
下面给出列举一些实例:
1.1 案例1——np.sum()
函数原型:
np.sum(a, axis=None, dtype=None, out=None, keepdims=False)
函数作用:
求给定的axis轴上的数组元素之和
import numpy as np
A = np.array([[1,2],[3,4]])
sum0 = np.sum(A, axis=0) #沿着0轴求和 ,也就是与0轴平行的方向求和(按列求和)
sum1 = np.sum(A, axis=1) #沿着1轴求和,也就是与1轴平行的方向求和(按行求和)
sum2 = np.sum(A)
print("输入矩阵:")
print(A)
print("沿着0轴求和(按列,axis = 0):",sum0)
print("沿着1轴求和(按行,aixs = 1):",sum1)
print("所有元素的和(axis = none):",sum2)
输入矩阵:
[[1 2]
[3 4]]
沿着0轴求和(按列,axis = 0): [4 6]
沿着1轴求和(按行,aixs = 1): [3 7]
所有元素的和(axis = none): 10
1.2案例2——np.argmax()
函数原型:
np.argmax(a, axis=None, out=None)
函数作用:
沿着axis轴返回最大值的索引
import numpy as np
A = np.random.random((3,4))
print("输入数组:")
print(A)
B = np.argmax(A,axis = 0)
C = np.argmax(A,axis = 1)
D = np.argmax(A,axis = -1)
E = np.argmax(A,axis = -2)
print("沿着0轴寻找最大值,并返回其索引:",B)
print("沿着1轴寻找最大值,并返回其索引:",C)
print("沿着-1轴寻找最大值,并返回其索引:",D)
print("沿着-2轴寻找最大值,并返回其索引:",E)
输入数组:
[[ 0.84279837 0.19618695 0.78035449 0.17604155]
[ 0.61023773 0.13680776 0.34354893 0.63371117]
[ 0.36884615 0.51836158 0.15862349 0.17267713]]
沿着0轴寻找最大值,并返回其索引: [0 2 0 1]
沿着1轴寻找最大值,并返回其索引: [0 3 1]
沿着-1轴寻找最大值,并返回其索引: [0 3 1]
沿着-2轴寻找最大值,并返回其索引: [0 2 0 1]
* 总结:*
根据上述试验发现,在axis的区间为[-2,2),axis的取值虽然可以不同,但是实际的效果却存在相同的情况,即
axis = -2 对应 axis = 0,效果一致;
axis = -1 对应 axis = 1,效果一致;
1.3 案例3——np.concatenate()
函数原型:
concatenate((a1, a2, …), axis=0)
函数作用:
沿着已有的axis轴,对数组进行合并
import numpy as np
A_1 = np.array([[1,2],[4,5]])
A_2 = np.zeros((2,2))
print("输入数组A_1:")
print(A_1)
print("输入数组A_2:")
print(A_2)
B = np.concatenate((A_1,A_2),axis = 0)
C = np.concatenate((A_1,A_2),axis = 1)
print("沿着0轴方向合并数组(垂直合并):\n",B)
print("沿着1轴方向合并数组(水平合并):\n",C)
输入数组A_1:
[[1 2]
[4 5]]
输入数组A_2:
[[ 0. 0.]
[ 0. 0.]]
沿着0轴方向合并数组(垂直合并):
[[ 1. 2.]
[ 4. 5.]
[ 0. 0.]
[ 0. 0.]]
沿着1轴方向合并数组(水平合并):
[[ 1. 2. 0. 0.]
[ 4. 5. 0. 0.]]
总结:
在numpy中还有很多函数中存在axis输入参数,比如np.mean()、np.max()、np.min()等函数,其对于的axis理解方式跟上述案例完全一致。