2014-10-04 13 views
17

Sto cercando una soluzione a una riga che possa aiutarmi a fare quanto segue.Numpy: riorganizzare l'array in base all'array dell'indice

Supponiamo che io sono

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

mi piacerebbe riorganizzare esso sulla base di un ordine di ingresso. Se ci fosse una funzione NumPy chiamato arrange, sarebbe effettuare le seguenti operazioni:

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

    [20, 10, 40, 50, 30] 

Formalmente, se la matrice da riordinare è mxn, e il "index" array è 1 xn, l'ordine sarebbe determinata dalla array chiamato "index".

Il numpy ha una funzione come questa?

risposta

23

Si può semplicemente utilizzare il "indice" lista direttamente, come, pure, una matrice di indice:

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

tende ad essere molto più velocemente se idx è già un ndarray e non un list, anche se Funzionerà in entrambi i modi:

>>> %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

Grazie! Cosa succede se l '"indice" è array 2d? Per esempio voglio girare '[[1,2], [" a "," b "]' in '[[2,1], [" a "," b "]]' usando l'indice '[ [1,0], [0,1]] '. So che un brutto modo di fare è usare il ciclo per riorganizzare ogni riga dell'array usando la riga corrispondente dell'array indice. Ma deve esserci un modo più veloce. – Skywalker326