Ordenar arrays en NumPy por columna

¿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.

Comentarios (9)
Solución

[@steve][1]'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][2]

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) #
Comentarios (11)

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]]]
Comentarios (1)