Numpy: argsort não funciona para matrizes multidimensionais

Criado em 19 mai. 2014  ·  12Comentários  ·  Fonte: numpy/numpy

considere o seguinte código:
a = np.random.random ([5,5])
ind = np.argsort (a, eixo = 1)
a_sorted = a [ind]
np.sort (a, eixo = 1)

agora a_sorted e a devem ser classificados ao longo do eixo 1. No entanto, nem mesmo as formas são mais idênticas. a ainda é de (5,5) enquanto a_ordenado é (5,5,5). Se esse for o comportamento pretendido, alguém pode me dizer por quê?

Comentários muito úteis

Seria bom se houvesse um exemplo de como realmente usar a saída para classificar o array ND.

Também seria bom se houvesse uma solução mais legível do que a[np.arange(np.shape(a)[0])[:,np.newaxis], np.argsort(a)]

Todos 12 comentários

argsort() está funcionando bem, mas a indexação não funciona da maneira que você espera.

http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#advanced -indexing

Experimente isto:

a = np.random.random([5,5])
i = np.arange(len(a))[:, np.newaxis]
j = np.argsort(a, axis=1)
a_sorted = a[i, j]
np.sort(a, axis=1)

Eu estava confuso da mesma forma. A documentação declara especificamente,

Devoluções
index_array: ndarray, int
Matriz de índices que classificam a ao longo do eixo especificado.
Em outras palavras, a[index_array] produz um a .

O que se aplica apenas a uma matriz 1D. A documentação deve ser estendida para especificar que este não é o caso para matrizes ND?

@lzkelley Sim, um patch para melhorar a documentação seria muito bem-vindo.

@shoyer legal, farei um PR para ele e atualizarei

Seria bom se houvesse um exemplo de como realmente usar a saída para classificar o array ND.

Também seria bom se houvesse uma solução mais legível do que a[np.arange(np.shape(a)[0])[:,np.newaxis], np.argsort(a)]

Talvez @seberg pudesse torná-lo um de seus acréscimos à função de indexação.

Eu não acho que se encaixe na indexação muito obviamente, uma função pick ou então provavelmente é uma combinação mais fácil.

+1 para uma nova função.

Todo o propósito de argsort (em oposição a sort ) não deve ser usado para indexação?

argsort fornece os índices para classificar ao longo de um eixo, mas na verdade classificar ao longo desse eixo usando os índices parece desnecessariamente prolixo. A menos que haja uma maneira mais simples que eu não conheça.

uma função de escolha ou então é provavelmente uma correspondência mais fácil.

Este é o número 8708

Esta página foi útil?
0 / 5 - 0 avaliações