找出 3*3*3 数组的正确 numpy 转置

Figuring out correct numpy transpose for 3*3*3 array

假设我有一个 3*3*3 数组 x。我想找出一个数组 y,使得 y[0,1,2] = x[1,2,0],或者更一般地说,y[a,b,c]= x[b,c,a]。我可以试试 numpy.transpose

import numpy as np
x = np.arange(27).reshape((3,3,3))
y = np.transpose(x, [2,0,1])
print(x[0,1,2],x[1,2,0])
print(y[0,1,2])

输出为

5 15
15

结果15,15是我所期望的(第一个15x[1,2,0]的参考值;第二个是y[0,1,2]的参考值)。但是,我在纸上画图找到了转置[2,0,1]

B C A
A B C

通过检查,转置应该是[2,0,1],上行的最后一个条目到下行的第一个;中间的最后;第一个走中间。是否有任何自动且有望有效的方法(如 numpy/sympy 中的任何标准函数)?

给定输入 y[a,b,c]= x[b,c,a],输出 [2,0,1]?

我发现用一个形状像 (2,3,4) 的例子更容易探索 tranpose,每个轴都不同。

但坚持你的 (3,3,3)

In [23]: x = np.arange(27).reshape(3,3,3)
In [24]: x
Out[24]: 
array([[[ 0,  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]]])
In [25]: x[0,1,2]
Out[25]: 5

您的样本转置:

In [26]: y = x.transpose(2,0,1)
In [27]: y
Out[27]: 
array([[[ 0,  3,  6],
        [ 9, 12, 15],
        [18, 21, 24]],

       [[ 1,  4,  7],
        [10, 13, 16],
        [19, 22, 25]],

       [[ 2,  5,  8],
        [11, 14, 17],
        [20, 23, 26]]])

我们得到与

相同的5
In [28]: y[2,0,1]
Out[28]: 5

我们可以通过应用相同的转置值得到 (2,0,1):

In [31]: idx = np.array((0,1,2))   # use an array for ease of indexing
In [32]: idx[[2,0,1]]
Out[32]: array([2, 0, 1])

按照我考虑陷阱 (2,0,1) 的方式,我们将最后一个轴 2 移到前面,并保留其他 2 的顺序。

使用不同的维度,更容易看到变化:

In [33]: z=np.arange(2*3*4).reshape(2,3,4)
In [34]: z
Out[34]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])
In [35]: z.transpose(2,0,1)
Out[35]: 
array([[[ 0,  4,  8],
        [12, 16, 20]],

       [[ 1,  5,  9],
        [13, 17, 21]],

       [[ 2,  6, 10],
        [14, 18, 22]],

       [[ 3,  7, 11],
        [15, 19, 23]]])
In [36]: _.shape
Out[36]: (4, 2, 3)

np.swapaxes 是另一个用于进行这些更改的编译函数。 np.rollaxis 是另一个,虽然它是最终调用 transpose.

的 python 代码

我没有尝试遵循您的所有推理,但我认为您想要一种与 transpose 数字相反的方式,您可以在其中指定结果顺序,并了解如何获取它们。