2014-10-04 140 views
17

我正在尋找一個能夠幫助我完成以下工作的單線解決方案。Numpy:根據索引數組重新排列數組

假設我有

array = np.array([10, 20, 30, 40, 50]) 

我想基於輸入順序重新安排它。如果有所謂的arrange一個numpy的功能,這將做到以下幾點:

newarray = np.arrange(array, [1, 0, 3, 4, 2]) 
print newarray 

    [20, 10, 40, 50, 30] 

形式上,如果要重新排序的陣列的步驟爲,而「索引」排列爲1個XN,訂貨會被確定數組稱爲「索引」。

numpy是否有這樣的功能?

回答

23

你可以簡單地直接使用你的「指數」列表中,作爲,以及,索引陣列:

>>> arr = np.array([10, 20, 30, 40, 50]) 
>>> idx = [1, 0, 3, 4, 2] 
>>> arr[idx] 
array([20, 10, 40, 50, 30]) 

它往往要快得多,如果idx已經是一個ndarray,而不是一個list,即使它將以任一方式工作:

>>> %timeit arr[idx] 
100000 loops, best of 3: 2.11 µs per loop 
>>> ai = np.array(idx) 
>>> %timeit arr[ai] 
1000000 loops, best of 3: 296 ns per loop 
+2

謝謝!如果「索引」是二維數組呢?例如,我想通過使用索引'[[1,2],[「a」,「b」]''變成'[[2,1],[「a」,「b」]] [1,0],[0,1]]'。我知道一個難看的方法是使用for循環來重新排列數組的每一行,使用索引數組的相應行。但是有一個更快的方法。 – Skywalker326 2016-06-29 08:04:29