簡體   English   中英

翻轉任意維度的 numpy 數組

[英]Flip numpy array of arbitrary dimension

我想構建一個輔助函數,它可以在所有維度上翻轉任意維度的多維 numpy 數組。 令人驚訝的是,我在網上沒有找到任何關於此的信息。

我們可以做一些像這樣丑陋的事情:

d = len(X.shape)
if d == 1:
    reversed_X = X[::-1]
elif d == 2:
    reversed_X = X[::-1, ::-1]
elif d == 3:
    reversed_X = X[::-1, ::-1, ::-1]
elif d == 4:
    reversed_X = X[::-1, ::-1, ::-1, ::-1]  
# ...etc

但必須有更好的方法。

我嘗試構建切片對象列表並按如下方式使用它們:

X[[slice(s,-1,-1) for s in X.shape]]

但這返回了一個空數組(!)。 更改切片的端點,如下所示:

X[[slice(s,0,-1) for s in X.shape]]

幾乎可以工作,但它錯過了每個維度的最后一個索引,使“反向”數組比原始數組略小。

發布后幾乎立即找出了我自己問題的答案。 在這里發布給未來的人。

出於某種原因,不能告訴切片對象在 -1 處停止,即使向后大步走也是如此。 但幸運的是,您可以停在“無”處,這會使數組向后飽和。 將此應用於原始問題中的代碼有效:

reversed_X = X[tuple([slice(None, None, -1) for _ in range(X.ndim)])]

示例:

In: X = np.reshape(np.arange(2*3), (2,3))
In: X
Out: 
array([[0, 1, 2],
       [3, 4, 5]])
In: X[tuple([slice(None, None, -1) for _ in range(X.ndim)])]
Out: 
array([[5, 4, 3],
       [2, 1, 0]])

numpy.flip(m, axis) (numpy 1.12.0 版中的新功能。)

所以這可能有效:

for k in range(X.ndim):
    X = np.flip(X, k)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM