接触numpy不久,一直不太理解里面的张量还有axis轴究竟是个什么东西。貌似随便给我一个高维的张量都不能描述它的shape是什么样的。后来自己仔细研究了一下,有所收获。
首先,张量不同于向量或者矩阵。一维的张量是没有行与列之分的。
import numpy as np
A = [1, 2]
B = [[1],[2]]
a = np.array(A)
b = np.array(B)
print(a, a.shape) # >>>[1 2] (2,)
print(b, b.shape) # >>>[[1]
# [2]] (2, 1)
所以这样输出的b并不是一个列向量,而是一个“矩阵”。
shape输出的元组里,每个数字表示的都是什么意思?下面的代码可以说明
import numpy as np
C = [[[1], [2]],
[[3], [4]],
[[4], [2]]]
c = np.array(C)
axis0 = np.sum(c, axis = 0)
axis1 = np.sum(c, axis = 1)
axis2 = np.sum(c, axis = 2)
print(c, c.shape) # >>> [[[1]
# [2]]
# [[3]
# [4]]
# [[4]
# [2]]] (3, 2, 1)
print("-" * 20)
print(axis0, axis0.shape) #>>> (2, 1)
print("-" * 20)
print(axis1, axis1.shape) #>>> (3, 1)
print("-" * 20)
print(axis2, axis2.shape) #>>> (3, 2)
定义了一个3维的张量C,怎么判断C的形状?这里最好不要从矩阵的角度来理解,我觉得从list的角度理解反而更好。c.shape的输出结果为(3, 2, 1),其中每个数字代表的就是中括号里元素的个数,3就是最外成的中括号里有3个元素。2和1同理。这样的话,任意给定一个高维的张量,也能判断它的形状了。
再就是axis的理解。从输出结果看,axis从小到大指定的就是shape输出里从左至右的维度。就sum这个方法而言,就是去掉指定维度的那个中括号就可以了。