张量的转置T和Transpose

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阶数组上, 然后再变换形状.