[英]Reverse an arbitrary dimension in an ndarray
我正在使用n維數組,我想要一種方法來反轉編號維度。 所以而不是
rev = a[:,:,::-1]
我希望能夠寫作
rev = a.reverse(dimension=2)
或類似的東西。 我似乎無法找到不依賴於前一種語法的示例。
如果你瀏覽numpy(python)源代碼,你會發現他們用來編寫在特定軸上運行的函數的技巧是使用np.swapaxes
將目標軸放在axis = 0
位置。 然后他們編寫在0-axis
運行的代碼,然后再次使用np.swapaxes
將0-axis
放回原來的位置。
你可以這樣做:
import numpy as np
def rev(a, axis = -1):
a = np.asarray(a).swapaxes(axis, 0)
a = a[::-1,...]
a = a.swapaxes(0, axis)
return a
a = np.arange(24).reshape(2,3,4)
print(rev(a, axis = 2))
產量
[[[ 3 2 1 0]
[ 7 6 5 4]
[11 10 9 8]]
[[15 14 13 12]
[19 18 17 16]
[23 22 21 20]]]
事實證明,這可以通過slice
完成,其中:
在某些情況下是簡寫。 訣竅是將索引對象構建為切片元組:
import numpy as np
def reverse(a, axis=0):
idx = [slice(None)]*len(a.shape)
idx[axis] = slice(None, None, -1)
return a[idx]
a = np.arange(24).reshape(2,3,4)
print reverse(a, axis=2)
使用Ellipsis
這可以折疊成一個單行:
a[[slice(None)]*axis + [slice(None, None, -1)] + [Ellipsis]]
對於未來遇到這種情況的人:
Numpy 1.12+具有np.flip(array, dimension)
,完全按照要求執行。 更好的是,它返回數據的視圖而不是副本,因此它會在不變的時間內發生。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.