Como posso ordenar uma matriz em NumPy pela enésima coluna?
Por exemplo,
a = array([[9, 2, 3],
[4, 5, 6],
[7, 0, 5]])
I'gostaria de ordenar as filas pela segunda coluna, de modo a que eu volte:
array([[7, 0, 5],
[9, 2, 3],
[4, 5, 6]])
Suponho que isto funciona: a[a[:,1].argsort()]a[a[:,1].argsort()]
Isto indica a segunda coluna de `a' e ordena-a com base nela em conformidade.
@steve's é na verdade a forma mais elegante de o fazer.
Para o "correct" modo ver o argumento da palavra-chave ordem de numpy.ndarray.sort
Contudo, você'precisará de ver a sua matriz como uma matriz com campos (uma matriz estruturada).
O "correct" o caminho é bastante feio se não't definir inicialmente a sua matriz com campos...
Como exemplo rápido, para a ordenar e devolver uma cópia:
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 a ordenar no local:
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 a forma mais elegante de o fazer, tanto quanto sei...
A única vantagem deste método é que o "order" argumento é uma lista dos campos para ordenar a pesquisa por. Por exemplo, pode ordenar pela segunda coluna, depois pela terceira coluna, depois pela primeira coluna fornecendo order=['f1','f2','f0'].
A partir do wiki de documentação Python, penso que pode fazer:
a = ([[1, 2, 3], [4, 5, 6], [0, 0, 1]]);
a = sorted(a, key=lambda a_entry: a_entry[1])
print a
A produção é:
[[[0, 0, 1], [1, 2, 3], [4, 5, 6]]]