目录
一、axis
一句话解释:设axis=i,则沿着第i个下标变化的方向进行操作(忽略该下标,其他下标相同的为一组,然后再对该组进行操作)
axis是将矩阵进行分组,然后再操作。而分组则意味着会降维,则每axis一次,维度就降低1(例如原来为三维矩阵, 现在对它进行操作,就会变为二维的)
当numpy函数不指定axis的值时,表示函数对所有元素进行操作;
当numpy函数指定axis的值时,表示函数沿着指定的axis轴方向进行操作;
axis=0:可以理解为按照行顺序,对列进行操作
axis=1:可以理解为按照列顺序,对行进行操作
>>> import numpy as np
>>> a=np.array([[1,2],
[3,4],
[5,6]])
>>> a.mean(axis=0)#按照行顺序,对每一列求均值
array([3., 4.])
>>> a.mean(axis=1)#按照列顺序,对每一行求均值
array([1.5, 3.5, 5.5])
实例:
import numpy as np
np.random.seed(1234)
embeddings = np.random.randint(0, 10, size=[3, 3, 5])
print(embeddings )
a = np.max(embeddings ,axis=-1)
b = np.max(embeddings ,axis=0)
c = np.max(embeddings ,axis=1)
print(a)
print(b)
print(c)
[[[3 6 5 4 8]
[9 1 7 9 6]
[8 0 5 0 9]][[6 2 0 5 2]
[6 3 7 0 9]
[0 3 2 3 1]][[3 1 3 7 1]
[7 4 0 5 1]
[5 9 9 4 0]]]
结果为:
[[8 9 9]
[6 9 3]
[7 7 9]][[6 6 5 7 8]
[9 4 7 9 9]
[8 9 9 4 9]][[9 6 7 9 9]
[6 3 7 5 9]
[7 9 9 7 1]]
刚刚的矩阵写成下标表示就是:
embeddings = [[[a000,a001,a002,a003,a004],
[a010,a011,a012,a013,a014],
[a020,a021,a022,a023,a024],
[a030,a031,a032,a033,a034]]
[[a100,a101,a102,a103,a104],
[a110,a111,a112,a113,a114],
[a120,a121,a122,a123,a124],
[a130,a131,a132,a133,a134]]
[[a200,a201,a202,a203,a204],
[a210,a211,a212,a213,a214],
[a220,a221,a222,a223,a224],
[a230,a231,a232,a233,a234]]
axis=0:
以axis=0为例,则沿着第0个下标(最左边的下标)变化的方向进行操作,也就是将除了第0个下标外,其他两个下标都相同的部分分成一组,然后再进行操作。具体分组如下(省略了一些组):
从上图可以看出,每3个数分成一组,所以现在总共是分了4*5个组(所以最终返回的结果也是一个shape=[4,5]的矩阵),对每个组都执行一次 max操作,将每个组的三个数中数值最大的数构成矩阵。
以axis=-1:
his means that the index that will be returned by argmax will be taken from the last axis.
这里需要特别说明一下axis=-1的操作,可能对python不熟悉的人会不理解这里的-1是哪个维度。在pyhton中,-1代表倒数第一个,也就是说,假如你的矩阵shape=[3,4,5],那么对这个矩阵来说,axis=-1,其实也就等于axis=2。因为这是个三维矩阵,所以axis可能的取值为0,1,2,所以最后一个就是2。你可以自己试试看两个取值结果是否相同。
2. 对axis的理解
通过上面的例子,你可能已经发现了,axis是将矩阵进行分组,然后再操作。而分组则意味着会降维。
以刚刚的例子,原始矩阵的shape=[3,4,5],取axis=0再进行操作后,得到的矩阵shape=[4,5]。同样的,取axis=1再进行操作后,得到的矩阵shape=[3,5]。取axis=-1(axis=2)再操作后,shape=[3,4]。掌握这一点,能有利于你在神经网络中的变换或是数据操作中明确矩阵变换前后的形状,从而加快对模型的理解。
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