2014-10-04 14 views
17

Szukam rozwiązania jednoliniowego, które pomogłoby mi wykonać następujące czynności.Numpy: Ponowne rozmieszczanie tablicy na podstawie tablicy indeksów

Załóżmy, że mam

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

chciałbym zmienić go w oparciu o kolejności wprowadzania. Gdyby nie było to funkcja numpy nazywa arrange, to należy wykonać następujące czynności:

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

    [20, 10, 40, 50, 30] 

Formalnie, jeśli tablica zostać zreorganizowane jest MXN, a „indeks” tablica jest 1 xn, kolejność będzie ustalana przez tablica o nazwie "indeks".

Czy numpy ma taką funkcję?

Odpowiedz

23

można po prostu użyć „wskaźnik” listy bezpośrednio, jak dobrze, tablicę index:

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

To wydaje się być o wiele szybciej, jeśli idx jest już ndarray a nie list, mimo że Działa to tak czy inaczej:

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

Dzięki! Co jeśli "indeks" to tablica 2d? Na przykład chcę zmienić '[[1,2], [" a "," b "]' na '[[2,1], [" a "," b "]]' przy użyciu indeksu '[ [1,0], [0,1]] ". Wiem, że brzydkim sposobem jest użycie for-loop do ponownego rozmieszczenia każdego wiersza tablicy przy użyciu odpowiedniego rzędu tablicy indeksów. Ale musi być szybszy sposób. – Skywalker326

Powiązane problemy