¿Cómo puedo ordenar un array en NumPy por la enésima columna?
Por ejemplo,
a = array([[9, 2, 3],
[4, 5, 6],
[7, 0, 5]])
Me gustaría ordenar las filas por la segunda columna, de tal manera que obtengo
array([[7, 0, 5],
[9, 2, 3],
[4, 5, 6]])
Supongo que esto funciona: a[a[:,1].argsort()]
Esto indica la segunda columna de a
y la ordena en base a ella.
@steve's es en realidad la forma más elegante de hacerlo.
Para la forma "correcta" ver el argumento de la palabra clave de orden de numpy.ndarray.sort
Sin embargo, necesitarás ver tu array como un array con campos (un array estructurado).
La forma "correcta" es bastante fea si no definiste inicialmente tu array con campos...
Como ejemplo rápido, para ordenarlo y devolver una copia:
In [1]: import numpy as np
In [2]: a = np.array([[1,2,3],[4,5,6],[0,0,1]])
In [3]: np.sort(a.view('i8,i8,i8'), order=['f1'], axis=0).view(np.int)
Out[3]:
array([[0, 0, 1],
[1, 2, 3],
[4, 5, 6]])
Para ordenarlo en el lugar:
In [6]: a.view('i8,i8,i8').sort(order=['f1'], axis=0) #<-- returns None
In [7]: a
Out[7]:
array([[0, 0, 1],
[1, 2, 3],
[4, 5, 6]])
@Steve's realmente es la manera más elegante de hacerlo, hasta donde yo sé...
La única ventaja de este método es que el argumento "orden" es una lista de los campos para ordenar la búsqueda por. Por ejemplo, se puede ordenar por la segunda columna, luego por la tercera columna y luego por la primera columna suministrando order=['f1','f2','f0'].
De la documentación de Python wiki, creo que se puede hacer:
a = ([[1, 2, 3], [4, 5, 6], [0, 0, 1]]);
a = sorted(a, key=lambda a_entry: a_entry[1])
print a
La salida es:
[[[0, 0, 1], [1, 2, 3], [4, 5, 6]]]