2012-06-28 19 views
5

La funzione argsort() restituisce una matrice di indici che può essere utilizzata per indicizzare l'array originale in modo che il risultato corrisponda al risultato sort().numpy: applicazione di argsort a un array

Esiste un modo per applicare tali indici? Ho due array, uno è l'array utilizzato per ottenere l'ordinamento e un altro sono alcuni dati associati.

Mi piacerebbe calcolare assoc_data[array1.argsort()] ma non sembra funzionare.

Ecco un esempio:

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]]) 

vorrei applicare i per Z2 (o di un altro array con dati associati), ma non sono sicuro come farlo.

+0

Quale asse vuoi ordinare? – user545424

risposta

7

Questo è probabilmente eccessivo, ma questo funzionerà nel caso 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

stranamente avevo bisogno di questo di nuovo esattamente un anno dopo, e nella ricerca di come farlo, ho incontrato la domanda che ho chiesto prima .... ho finalmente capito cosa fa. Non sembra eccessivo, btw. –

0

Aha, capito.

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 - questo funziona per 2D, non per 3D. sospiro. –

+0

Inoltre non hai detto cosa fossi;) – tiho

+0

um .... sì, ho detto cosa era "i"; leggi la domanda –

4

Sei fortunato Ho appena ricevuto la mia laurea in 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]]) 

Per una spiegazione di quello che sta succedendo, si veda la mia risposta a this question.