2012-06-28 16 views
5

La función argsort() devuelve una matriz de índices que se puede usar para indexar la matriz original para que el resultado coincida con el resultado sort().numpy: aplicar argsort a una matriz

¿Hay alguna manera de aplicar esos índices? Tengo dos matrices, una es la matriz utilizada para obtener el orden de clasificación y otra son algunos datos asociados.

Me gustaría calcular assoc_data[array1.argsort()] pero eso no parece funcionar.

He aquí un ejemplo:

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

me gustaría aplicar i para Z2 (u otra matriz con los datos asociados), pero no estoy seguro de cómo hacerlo.

+0

¿Qué eje desea ordenar? – user545424

Respuesta

7

Esto es algo excesivo, pero esto va a funcionar en el caso de 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

, curiosamente, necesitaba esto otra vez exactamente un año después, y al buscar cómo hacerlo, me encontré con la pregunta que hice antes ... Finalmente entiendo lo que hace. No parece excesivo, por cierto. –

0

Aha, lo descubrí.

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: esto funciona para 2D, no para 3D. suspiro. –

+0

Además, no dijiste lo que era;) – tiho

+0

um .... Sí, dije qué era 'i'; Lea la pregunta. –

4

tienes suerte acabo de recibir mi maestría en 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]]) 

Para una explicación de lo que está pasando, ver mi respuesta a this question.

Cuestiones relacionadas