让我们举一个非常简单的例子:一个形状为(2,3,4)的数组,忽略其值。
>>> a.shape
(2, 3, 4)
换位并打印尺寸时
>>> a.transpose([1,2,0]).shape
(3, 4, 2)
所以我说的是:取轴索引2为第一个,然后取轴索引0为第二个,最后取轴索引1为第三个。我应该得到(4,2,3),对吧?
嗯,我想也许我不完全理解逻辑。因此,我阅读了文档,并说:
使用transpose(a,argsort(axes))反转张量的转置 在使用axes关键字参数时。
所以我尝试了
>>> c = np.transpose(a, [1,2,0])
>>> c.shape
(3, 4, 2)
>>> np.transpose(a, np.argsort([1,2,0])).shape
(4, 2, 3)
形状完全不同!
有人可以解释一下吗?谢谢。
答案 0 :(得分:4)
In [259]: a = np.zeros((2,3,4))
In [260]: idx = [1,2,0]
In [261]: a.transpose(idx).shape
Out[261]: (3, 4, 2)
要做的是将a.shape[1]
维度放在首位。 a.shape[2]
是第二名,a.shape[0]
是第三名:
In [262]: np.array(a.shape)[idx]
Out[262]: array([3, 4, 2])
不带参数的 transpose
是轴顺序的完全反转。这是熟悉的2d转置的扩展(行变成列,列变成行):
In [263]: a.transpose().shape
Out[263]: (4, 3, 2)
In [264]: a.transpose(2,1,0).shape
Out[264]: (4, 3, 2)
什么都不做:
In [265]: a.transpose(0,1,2).shape
Out[265]: (2, 3, 4)
您有一个初始轴顺序和最后一个轴顺序;如果您不定期使用大小为3或更大的列表,则很难直观地描述交换内容。
有些人发现使用swapaxes
更容易,它可以更改正轴的顺序。 rollaxis
是另一种方式。
我更喜欢使用transpose
,因为它可以做其他人可以做的任何事情;所以我只需要为一种工具开发一种直观的工具即可。
argsort
注释的操作方式如下:
In [278]: a.transpose(idx).transpose(np.argsort(idx)).shape
Out[278]: (2, 3, 4)
也就是说,将其应用于一个转置的结果以恢复原始顺序。
答案 1 :(得分:1)
np.argsort([1,2,0])返回一个类似于[2,0,1]
的数组所以
np.transpose(a, np.argsort([1,2,0])).shape
像
np.transpose(a, [2,0,1]).shape
不是
np.transpose(a, [1,2,0]).shape