我正在處理一個n維數組,並且我想要一種方法來反轉編號的維度。因此,而不是在ndarray中反轉任意尺寸
rev = a[:,:,::-1]
我希望能夠寫
rev = a.reverse(dimension=2)
或類似的東西。我似乎無法找到不依賴於前一種語法的示例。
我正在處理一個n維數組,並且我想要一種方法來反轉編號的維度。因此,而不是在ndarray中反轉任意尺寸
rev = a[:,:,::-1]
我希望能夠寫
rev = a.reverse(dimension=2)
或類似的東西。我似乎無法找到不依賴於前一種語法的示例。
對於任何人碰到這個即將到來的未來:
Numpy 1.12+的功能np.flip(array, dimension)
,它完全按照要求。更好的是,它返回的是數據視圖而不是副本,所以它會在一段時間內發生。
如果您瀏覽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]]
切片是最好的! – David
如果你知道你需要的語法,爲什麼不把它放到你自己的'rev'函數中? – Makoto
我會很好,但我希望函數採取一個整數(維度反向)並返回沿該維度顛倒的數組。我不知道如何將'1:'轉換爲'[:,:: - 1,:]'和'0'爲[[:: - 1,:,]]尺寸。 – Shep