【问题标题】:Rearranging axes in numpy?在numpy中重新排列轴?
【发布时间】:2020-05-13 03:18:23
【问题描述】:

我有一个 ndarray,例如

>>> arr = np.random.rand(10, 20, 30, 40)
>>> arr.shape
(10, 20, 30, 40)

我想将其轴交换成任意顺序,例如

>>> rearranged_arr = np.swapaxes(np.swapaxes(arr, 1,3), 0,1)
>>> rearranged_arr.shape
(40, 10, 30, 20)

是否有一个函数可以实现这一点而不必将一堆np.swapaxes 链接在一起?

【问题讨论】:

  • np.transpose 一次最多可以移动多个轴。

标签: python numpy


【解决方案1】:

有两个选项:np.moveaxisnp.transpose

  • np.moveaxis(a, sources, destinations)docs

    此功能可用于重新排列特定尺寸的 大批。例如,将第 4 维移动到第 1 维,将第 2 维移动到最后:

    >>> rearranged_arr = np.moveaxis(arr, [3, 1], [0, 3])
    >>> rearranged_arr.shape
    (40, 10, 30, 20)
    

    如果您有许多维度并且只想重新排列其中的一小部分,这将特别有用。例如

    >>> another_arr = np.random.rand(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
    >>> np.moveaxis(another_arr, [8, 9], [0, 1]).shape
    (8, 9, 0, 1, 2, 3, 4, 5, 6, 7)
    
  • np.transpose(a, axes=None)docs

    此函数可用于一次重新排列数组的所有维。例如,要解决您的特殊情况:

    >>> rearranged_arr = np.transpose(arr, axes=[3, 0, 2, 1])
    >>> rearranged_arr.shape
    (40, 10, 30, 20)
    

    或等效

    >>> rearranged_arr = arr.transpose(3, 0, 2, 1)
    >>> rearranged_arr.shape
    (40, 10, 30, 20)
    

【讨论】:

  • 虽然我几乎为提出一个可以通过几分钟研究得到答案的问题和答案而感到难过,但两者都是合法且有用的帖子。
  • np.moveaxis 对于张量对象的操作非常有用。谢谢。
  • 感谢你们两位的 cmets,我已尽我所能改进答案,超出了在琐碎的谷歌搜索中出现的答案。
【解决方案2】:
In [126]: arr = np.random.rand(10, 20, 30, 40)                                                               
In [127]: arr.transpose(3,0,2,1).shape                                                                       
Out[127]: (40, 10, 30, 20)

【讨论】:

    猜你喜欢
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 2021-12-23
    • 2013-12-14
    • 1970-01-01
    相关资源
    最近更新 更多