代码之家  ›  专栏  ›  技术社区  ›  Jeff Saremi

被numpy的转置所迷惑

  •  1
  • Jeff Saremi  · 技术社区  · 6 年前

    让我们来看一个非常简单的例子:一个具有形状(2,3,4)的数组,忽略这些值。

    >>> a.shape
    (2, 3, 4)
    

    当我们将其转置并打印尺寸时:

    >>> a.transpose([1,2,0]).shape
    (3, 4, 2)
    

    我是说:取轴索引2,使其成为第一个,然后取轴索引0,使其成为第二个,最后取轴索引1,使其成为第三个。我应该得到(4,2,3),对吗?

    嗯,我想也许我不完全理解逻辑。所以我读了文件,上面写着:

    使用转置(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 回复  |  直到 6 年前
        1
  •  4
  •   hpaulj    6 年前
    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 没有参数是轴顺序的完全反转。这是熟悉的二维转置(行变列,列变行)的扩展:

    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 是另一种方式。

    我更喜欢使用 转置 因为它可以做其他人能做的任何事情;所以我只需要为一个工具开发一个直观的工具。


    这个 argsort 注释的操作方式如下:

    In [278]: a.transpose(idx).transpose(np.argsort(idx)).shape
    Out[278]: (2, 3, 4)
    

    也就是说,将它应用于一个转置的结果,以恢复原始顺序。

        2
  •  1
  •   James Liu    6 年前

    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