被numpy的转置所困扰

时间:2018-08-08 05:48:47

标签: numpy linear-algebra

让我们举一个非常简单的例子:一个形状为(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)

形状完全不同!

有人可以解释一下吗?谢谢。

2 个答案:

答案 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