找出 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
是我所期望的(第一个15
是x[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
数字相反的方式,您可以在其中指定结果顺序,并了解如何获取它们。
假设我有一个 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
是我所期望的(第一个15
是x[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
.
我没有尝试遵循您的所有推理,但我认为您想要一种与 transpose
数字相反的方式,您可以在其中指定结果顺序,并了解如何获取它们。