2012-06-28 14 views
5

Funkcja argsort() zwraca macierz indeksów, które mogą być używane do indeksowania oryginalnej tablicy, aby wynik był zgodny z wynikiem sort().numpy: zastosowanie argsort do tablicy

Czy istnieje sposób na zastosowanie tych wskaźników? Mam dwie tablice, jedna to tablica używana do uzyskania kolejności sortowania, a druga to niektóre powiązane dane.

Chciałbym obliczyć assoc_data[array1.argsort()], ale to nie wydaje się działać.

Oto przykład:

z=array([1,2,3,4,5,6,7]) 
z2=array([z,z*z-7]) 
i=z2.argsort() 

z2=array([[ 1, 2, 3, 4, 5, 6, 7], 
      [-6, -3, 2, 9, 18, 29, 42]]) 
i =array([[1, 1, 1, 0, 0, 0, 0], 
      [0, 0, 0, 1, 1, 1, 1]]) 

Chciałbym zastosować ja do Z2 (lub innego powiązanego z tablicą danych), ale nie jestem pewien, jak to zrobić.

+0

Którą oś chcesz posortować? – user545424

Odpowiedz

7

To chyba przesada, ale to będzie działać w przypadku Nd:

import numpy as np 
axis = 0 
index = list(np.ix_(*[np.arange(i) for i in z2.shape])) 
index[axis] = z2.argsort(axis) 
z2[index] 

# Or if you only need the 3d case you can use np.ogrid. 

axis = 0 
index = np.ogrid[:z2.shape[0], :z2.shape[1], :z2.shape[2]] 
index[axis] = z2.argsort(axis) 
z2[index] 
+4

To dziwne, że potrzebowałem tego znowu dokładnie rok później, a gdy szukałem, jak to zrobić, natknąłem się na pytanie, które zadałem wcześniej ... W końcu rozumiem, co to robi. To nie wygląda na przesadę, przy okazji. –

0

Aha, wymyśliłem to.

In [274]: z2[i,range(z2.shape[1])] 
Out[274]: 
array([[-6, -3, 2, 4, 5, 6, 7], 
     [ 1, 2, 3, 9, 18, 29, 42]]) 
+1

Argh - działa to dla 2D, nie dla 3D. westchnienie. –

+0

Plus nie powiedziałeś, co ja;) – tiho

+0

um .... tak, powiedziałem, czym był "ja"; przeczytaj pytanie. –

4

Masz szczęście, że właśnie dostał dyplom magistra numpyology.

>>> def apply_argsort(a, axis=-1): 
...  i = list(np.ogrid[[slice(x) for x in a.shape]]) 
...  i[axis] = a.argsort(axis) 
...  return a[i] 
... 
>>> a = np.array([[1,2,3,4,5,6,7],[-6,-3,2,9,18,29,42]]) 
>>> apply_argsort(a,0) 
array([[-6, -3, 2, 4, 5, 6, 7], 
     [ 1, 2, 3, 9, 18, 29, 42]]) 

Aby uzyskać wyjaśnienie, co się dzieje, zobacz moją odpowiedź na this question.