我在 Wes McKinney 的《Python数据分析》中也看到了这个。
我将展示解决 3 维张量的最简单方法,然后描述可用于 n 维张量的一般方法。
简单的 3 维张量示例
假设您有一个(2,2,4)张量:
[[[ 0 1 2 3]
[ 4 5 6 7]]
[[ 8 9 10 11]
[12 13 14 15]]]
如果我们查看每个点的坐标,它们如下:
[[[ (0,0,0) (0,0,1) (0,0,2) (0,0,3)]
[ (0,1,0) (0,1,1) (0,1,2) (0,1,3)]]
[[ (1,0,0) (1,0,1) (1,0,2) (0,0,3)]
[ (1,1,0) (1,1,1) (1,1,2) (0,1,3)]]
假设上面的数组是example_array
,我们想执行操作:example_array.transpose(1,2,0)
对于(1,2,0)
转换,我们按以下方式重新排列坐标(请注意,这个特定的转换相当于“向左移位”):
(0,0,0) -> (0,0,0)
(0,0,1) -> (0,1,0)
(0,0,2) -> (0,2,0)
(0,0,3) -> (0,3,0)
(0,1,0) -> (1,0,0)
(0,1,1) -> (1,1,0)
(0,1,2) -> (1,2,0)
(0,1,3) -> (1,3,0)
(1,0,0) -> (0,0,1)
(1,0,1) -> (0,1,1)
(1,0,2) -> (0,2,1)
(0,0,3) -> (0,3,0)
(1,1,0) -> (1,0,1)
(1,1,1) -> (1,1,1)
(1,1,2) -> (1,2,1)
(0,1,3) -> (1,3,0)
现在,对于每个原始值,在结果矩阵中放置它到偏移后的坐标。
例如,值 10
在原始矩阵中的坐标为 (1, 0, 2)
,在结果矩阵中将具有坐标 (0, 2, 1)
。它被放置在第三行中的第一个2d张量子矩阵中,在该子矩阵的第二列行。
因此,得到的矩阵为:
array([[[ 0, 8],
[ 1, 9],
[ 2, 10],
[ 3, 11]],
[[ 4, 12],
[ 5, 13],
[ 6, 14],
[ 7, 15]]])
通用的n维张量方法
对于n维张量,算法与二维矩阵相同。考虑原始矩阵中单个值的所有坐标。对该单个坐标的轴进行重排。将该值放入结果矩阵中相应的重排坐标中。对所有剩余的值重复此操作。
0
是第一轴,1
是第二轴,2
是第三轴,等等......transpose
函数的axes
参数指定了你想要重新排列的新顺序,例如:先放置第二轴,然后是第一轴,最后是第三轴。 - Jaime