Intro
张量的转置和位置调换, 及在高维度上如何运算.
T
首先生成一个[4, 4]
的张量, 转置就是行列索引交换, 反映在矩阵上就是上三角形反转到下三角形.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| b = np.arange(0, 16).reshape([4, 4]) print('b', b) print('b.T', b.T)
""" b [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15]] b.T [[ 0 4 8 12] [ 1 5 9 13] [ 2 6 10 14] [ 3 7 11 15]] """
|
对于奇数阶张量, 则是前向和后向索引依次进行交换, 中间会有一阶不变.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| a = np.arange(0, 24).reshape([3, 4, 2]) print('a', a) print('a.T', a.T)
""" a [[[ 0 1] [ 2 3] [ 4 5] [ 6 7]]
[[ 8 9] [10 11] [12 13] [14 15]]
[[16 17] [18 19] [20 21] [22 23]]]
a.T.shape([2, 4, 3]) a.T [[[ 0 8 16] [ 2 10 18] [ 4 12 20] [ 6 14 22]]
[[ 1 9 17] [ 3 11 19] [ 5 13 21] [ 7 15 23]]] """
|
对于偶数阶张量, 则是前向和后向索引依次进行交换.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| a = np.arange(0, 24).reshape([1, 2, 3, 4]) print('a', a.shape) print('a', a) print('a.T', a.T.shape) print('a.T', a.T)
""" a (1, 2, 3, 4) a [[[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]]
[[12 13 14 15] [16 17 18 19] [20 21 22 23]]]] a.T (4, 3, 2, 1) a.T [[[[ 0] [12]]
[[ 4] [16]]
[[ 8] [20]]]
[[[ 1] [13]]
[[ 5] [17]]
[[ 9] [21]]]
[[[ 2] [14]]
[[ 6] [18]]
[[10] [22]]]
[[[ 3] [15]]
[[ 7] [19]]
[[11] [23]]]] """
|
Transpose
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| c = a.transpose(0, 2, 1) d = a.reshape([2, 2, 4]) print('\n', 'c', c.shape) print(c) print('\n', 'd', d.shape) print(d)
""" c (2, 2, 4) [[[ 0 2 4 6] [ 1 3 5 7]]
[[ 8 10 12 14] [ 9 11 13 15]]]
d (2, 2, 4) [[[ 0 1 2 3] [ 4 5 6 7]]
[[ 8 9 10 11] [12 13 14 15]]] """
|
Transpose
有别于 reshape
它是将不同维度上的数进行转换, 而reshape相当于先将所有的数放到1阶数组上, 然后再变换形状.