Estou surpreso que esta pergunta específica não tenha sido feita antes, mas eu realmente não a encontrei no SO nem na documentação do np.sort
.
Digamos que eu tenha uma matriz numpy aleatória contendo inteiros, por exemplo:
> temp = np.random.randint(1,10, 10)
> temp
array([2, 4, 7, 4, 2, 2, 7, 6, 4, 4])
Se eu classificar, obtenho ordem crescente por padrão:
> np.sort(temp)
array([2, 2, 2, 4, 4, 4, 4, 6, 7, 7])
mas quero que a solução seja classificada em ordem decrescente .
Agora, eu sei que sempre posso fazer:
reverse_order = np.sort(temp)[::-1]
mas esta última afirmação é eficiente ? Não cria uma cópia em ordem crescente e, em seguida, reverte essa cópia para obter o resultado na ordem reversa? Se for esse o caso, existe uma alternativa eficiente? Parece que não np.sort
aceita parâmetros para alterar o sinal das comparações na operação de classificação para obter as coisas na ordem inversa.
temp[::-1].sort()
sabe que tem que classificar na ordem inversa ?? A maneira como eu li isso é: inverta a matriz original e, em seguida, classifique-a (em ordem crescente). Por que inverter a matriz original (vindo em uma ordem aleatória) e, em seguida, classificá-la em ordem crescente retornaria a matriz na ordem inversa?[::-1]
simplesmente diz a numpy para iterar no array de trás para frente, em vez de reordenar o array. Portanto, quando a classificação no local acontece, ela realmente classifica em ordem crescente e move partes, mas deixa a parte da iteração reversa intacta.a=np.array((...))
o idiomaa[::-1]
não reverte nada, é apenas uma nova visualização dos mesmos dados, mais especificamente uma visualização em espelho. O métodoa[::-1].sort()
opera na imagem espelhada , o que implica que aosort
mover para a esquerda um item menor em sua imagem espelhada, na realidade ele o está movendo para a direita no bloco de memória real doa
array. A visualização espelhada é classificada em ordem crescente, os dados reais são classificados em ordem decrescente. Experimente você mesmo em casa, com algumas moedas diferentes e um espelho!np.sort(temp,order='descending')
vez de exigir esses tipos de hacksfonte
axis
qualnp.sort
foi aplicado é necessário.np.sort(temp)[::-1]
colocarnan
s na parte de trás da matriz em vez de na frente. Se isso é bom ou ruim está em debate.Para matrizes curtas, sugiro usar
np.argsort()
encontrando os índices da matriz ordenada negativada, o que é um pouco mais rápido do que inverter a matriz classificada:fonte
a[np.argsort(-a)]
é provavelmente a melhor abordagem para qualquer outra nesta página. Sem reversão de passo -1 e menos um sinal de menos para pensar.Infelizmente, quando você tem uma matriz complexa, só
np.sort(temp)[::-1]
funciona corretamente. Os dois outros métodos mencionados aqui não são eficazes.fonte
Cuidado com as dimensões.
Deixei
Full Reverse
flip
alterado em1.15
, versões anteriores necessárias . Solução: .1.14
axis
pip install --upgrade numpy
Primeira dimensão invertida
Segunda dimensão invertida
Testando
Testando em uma matriz 100 × 10 × 10 1000 vezes.
Isso se deve principalmente à reindexação, e não a
argsort
.fonte
Olá, eu estava procurando uma solução para reverter a classificação de um array numpy bidimensional e não consegui encontrar nada que funcionasse, mas acho que encontrei uma solução que estou enviando para o caso de alguém estar no mesmo barco.
np.sort classifica em ordem crescente, o que não é o que você deseja, mas o comando fliplr vira as linhas da esquerda para a direita! Parece funcionar!
Espero que te ajude!
Eu acho que é semelhante à sugestão sobre -np.sort (-a) acima, mas fiquei desanimado por comentar que nem sempre funciona. Talvez minha solução nem sempre funcione, no entanto, eu a testei com alguns arrays e parece estar OK.
fonte
Você pode classificar a matriz primeiro (crescente por padrão) e, em seguida, aplicar np.flip () ( https://docs.scipy.org/doc/numpy/reference/generated/numpy.flip.html )
Para sua informação, também funciona com objetos datetime.
Exemplo:
fonte
x = np.array([2,3,np.nan,1,0])
então anp.flip(np.sort(x))
abordagem produz [nan 3. 2. 1. 0.], enquanto a-np.sort(-x)
abordagem produz [3. 2. 1. 0. nan].Aqui está um truque rápido
fonte
eu sugiro usar isso ...
por exemplo:
Em seguida, seu novo ataque:
fonte
np.arange(20-0.5, 10-0.5, -0.5)
. Mas essa é uma história diferente e pode ser, por causa da pior legibilidade, discutível. Uma matriz de entrada não está classificada de forma alguma