您的位置:首页 > 编程语言 > Python开发

Numpy、TensorFlow和Keras函数输入参数axis理解(一)

2017-12-26 19:25 453 查看
在利用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理解方式跟上述案例完全一致。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: