2011-11-16 20 views
5

tengo una listaOrdenar una matriz numpy como una mesa

[[0, 3], [5, 1], [2, 1], [4, 5]] 

que he hecho en una matriz usando numpy.array:

[[0 3] 
[5 1] 
[2 1] 
[4 5]] 

¿Cómo resolver esto como una mesa? En particular, quiero ordenar por la segunda columna en orden ascendente y luego resolver los vínculos haciendo que la primera columna se ordene en orden ascendente. Por lo tanto, deseo:

[[2 1] 
[5 1] 
[0 3] 
[4 5]] 

¡Cualquier ayuda sería muy apreciada!

Respuesta

7

Ver http://docs.scipy.org/doc/numpy/reference/generated/numpy.lexsort.html#numpy.lexsort

Específicamente, en su caso,

import numpy as np 
x = np.array([[0,3],[5,1],[2,1],[4,5]]) 
x[np.lexsort((x[:,0],x[:,1]))] 

salidas

array([[2,1],[5,1],[0,3],[4,5]]) 
+0

Hola, gracias por la solución. Me gusta más esto porque me muestra que al reemplazar x [:, 0] con x [:: - 1,0], puedo invertir la dirección de la segunda clasificación (de la primera columna). Muchas gracias a todos! – Derek

4

Usted puede utilizar numpy.lexsort():

>>> a = numpy.array([[0, 3], [5, 1], [2, 1], [4, 5]]) 
>>> a[numpy.lexsort(a.T)] 
array([[2, 1], 
     [5, 1], 
     [0, 3], 
     [4, 5]]) 
2

Un forma tro de hacer esto - cortar los bits de datos que desea, obtener los índices de ordenar el uso de argsort, a continuación, utilizar el resultado de que al cortar su matriz original:

a = np.array([[0, 3], [5, 1], [2, 1], [4, 5]]) 

subarray = a[:,1] # 3,1,1,5 

indices = np.argsort(subarray) # Returns array([1,2,0,3]) 

result = a[indices] 

O, todo de una vez:

a[np.argsort(a[:,1])] 
+2

Esto no ordena los vínculos necesariamente (1ra columna en orden ascendente). – Bruno

+0

Verdadero - lexsort parece una mejor opción aquí – FredL

1

Si desea ordenar el uso de una sola columna única (por ejemplo, segunda columna), se puede hacer algo como:

from operator import itemgetter 
a = [[0, 3], [5, 1], [2, 1], [4, 5]] 
a_sorted = sorted(a, key=itemgetter(1)) 

Si hay más de una clave, a continuación, utilizar numpy.lexsort() como se señaló en th otras respuestas

+0

Gracias, en mi caso 'numpy.array (ordenado (a, key = itemgetter (1)))' funcionó perfectamente aún siendo la opción más legible. – firegurafiku

Cuestiones relacionadas