Por que você achou [3 2 0 1]que teria sido a resposta correta?
Zwol
9
Eu só tinha uma compreensão invertida da saída. Ou seja, se você pegar o primeiro elemento de x, ele deve estar na posição 3 de uma matriz classificada e assim por diante.
user1276273
26
sua maneira de pensar totalmente faz sentido, eu tinha exatamente a mesma pergunta
adrienlucca.wordpress.com
2
[3 2 0 1] - isto está classificando os valores, você não está obtendo os índices reais.
Lahiru Karunaratne
Apenas para lembrar que a saída indica locais na matriz original enquanto você pensa na matriz classificada. Isso significa que a saída [0] é o índice onde o menor elemento na matriz de entrada original localiza e a saída [-1] para o maior elemento.
Esses %timeitbenchmarks IPython sugerem que para grandes matrizes using_indexed_assignmenté o mais rápido:
In[50]: x = np.random.random(10**5)In[66]:%timeit using_indexed_assignment(x)100 loops, best of 3:9.32 ms per loopIn[70]:%timeit using_rankdata(x)100 loops, best of 3:10.6 ms per loopIn[56]:%timeit using_argsort_twice(x)100 loops, best of 3:16.2 ms per loopIn[59]:%timeit using_digitize(x)10 loops, best of 3:27 ms per loop
Para matrizes pequenas, using_argsort_twicepode ser mais rápido:
In[78]: x = np.random.random(10**2)In[81]:%timeit using_argsort_twice(x)100000 loops, best of 3:3.45µs per loopIn[79]:%timeit using_indexed_assignment(x)100000 loops, best of 3:4.78µs per loopIn[80]:%timeit using_rankdata(x)100000 loops, best of 3:19µs per loopIn[82]:%timeit using_digitize(x)10000 loops, best of 3:26.2µs per loop
Observe também que stats.rankdatavocê oferece mais controle sobre como lidar com elementos de igual valor.
Você pode adicionar alguma explicação sobre por que aplicar argsort () duas vezes nos dá a classificação?
Phani
1
@Phani: argsortretorna os índices da matriz classificada. O índice dos índices classificados é a classificação. É para isso que a segunda chamada argsortretorna.
Unutbu
2
O primeiro argumento retorna uma permutação (que se aplicada aos dados a classificaria). Quando argsort é aplicado a (essa ou qualquer) permutação, ele retorna a permutação inversa (que, se as 2 permutações forem aplicadas uma à outra em qualquer ordem, o resultado será a Identidade). A segunda permutação, se aplicada a uma matriz de dados classificados, produziria a matriz de dados não classificados, ou seja, é a classificação.
Alex C
1
Mente soprada. Eu finalmente entendi! Retorna uma matriz cujo conteúdo são os índices da matriz original em uma ordem classificada.
Isso significa que o primeiro elemento do argsort é o índice do elemento que deve ser classificado primeiro, o segundo elemento é o índice do elemento que deve ser o segundo, etc.
O que você parece querer é a ordem de classificação dos valores, que é fornecida por scipy.stats.rankdata. Observe que você precisa pensar no que deve acontecer se houver laços nas fileiras.
Execute uma classificação indireta ao longo do eixo especificado, usando o algoritmo especificado pela palavra-chave kind. Ele retorna uma matriz de índices da mesma forma que os dados do índice ao longo do eixo especificado em ordem classificada.
Considere um exemplo em python, com uma lista de valores como
listExample =[0,2,2456,2000,5000,0,1]
Agora usamos a função argsort:
import numpy as np
list(np.argsort(listExample))
A saída será
[0,5,6,1,3,2,4]
Esta é a lista de índices de valores em listExample, se você mapear esses índices para os respectivos valores, obteremos o resultado da seguinte forma:
[0,0,1,2,2000,2456,5000]
(Eu acho essa função muito útil em muitos lugares, por exemplo, se você deseja classificar a lista / matriz, mas não deseja usar a função list.sort () (ou seja, sem alterar a ordem dos valores reais na lista), você pode usar isso função.)
Embora esse snippet de código possa ser a solução, incluir uma explicação realmente ajuda a melhorar a qualidade da sua postagem. Lembre-se de que você está respondendo à pergunta dos leitores no futuro e essas pessoas podem não saber os motivos da sua sugestão de código.
peacetype
0
Primeiro, foi ordenada a matriz. Em seguida, gere uma matriz com o índice inicial da matriz.
np.argsort retorna o índice da matriz classificada dada pelo 'kind' (que especifica o tipo de algoritmo de classificação). No entanto, quando uma lista é usada com np.argmax, ele retorna o índice do maior elemento da lista. Enquanto, np.sort, classifica a matriz, lista.
x[x.argsort()]não é necessariamente o mesmo que np.sort(x). Na verdade, não é necessariamente nem a mesma forma. Tente isso com uma matriz 2D. Isso acontece apenas com matrizes 1D.
1957 Nathan
Eu sinto que isso é desnecessariamente pedante. A questão é sobre matrizes 1D. Isso pretende ser uma maneira de entender qual era a diferença, em vez de usar um código literal. Além disso, quando você tem uma matriz 2D, nem fica claro que tipo de classificação você deseja. Você quer uma classificação global? Caso contrário, qual eixo deve ser classificado? Independentemente disso, adicionei um aviso.
Multihunter
0
Ele retorna índices de acordo com os índices de matriz fornecidos [1.48,1.41,0.0,0.1], ou seja:
0.0é o primeiro elemento, no índice [2].
0.1é o segundo elemento, no índice [3].
1.41é o terceiro elemento, no índice [1].
1.48é o quarto elemento, no índice [0]. Resultado:
[3 2 0 1]
que teria sido a resposta correta?Respostas:
De acordo com a documentação
2
é o índice de0.0
.3
é o índice de0.1
.1
é o índice de1.41
.0
é o índice de1.48
.fonte
a = x.argsort()
, Imprimirx[a]
, teremosarray([ 0. , 0.1 , 1.41, 1.48])
[2, 3, 1, 0]
indica que o menor elemento está no índice 2, o menor menor no índice 3, depois no índice 1 e depois no índice 0.Existem várias maneiras de obter o resultado que você está procurando:
Por exemplo,
Isso verifica se todos eles produzem o mesmo resultado:
Esses
%timeit
benchmarks IPython sugerem que para grandes matrizesusing_indexed_assignment
é o mais rápido:Para matrizes pequenas,
using_argsort_twice
pode ser mais rápido:Observe também que
stats.rankdata
você oferece mais controle sobre como lidar com elementos de igual valor.fonte
argsort
retorna os índices da matriz classificada. O índice dos índices classificados é a classificação. É para isso que a segunda chamadaargsort
retorna.Como a documentação diz
argsort
:Isso significa que o primeiro elemento do argsort é o índice do elemento que deve ser classificado primeiro, o segundo elemento é o índice do elemento que deve ser o segundo, etc.
O que você parece querer é a ordem de classificação dos valores, que é fornecida por
scipy.stats.rankdata
. Observe que você precisa pensar no que deve acontecer se houver laços nas fileiras.fonte
numpy.argsort (a, eixo = -1, tipo = 'classificação rápida', ordem = Nenhuma)
Retorna os índices que ordenariam uma matriz
Execute uma classificação indireta ao longo do eixo especificado, usando o algoritmo especificado pela palavra-chave kind. Ele retorna uma matriz de índices da mesma forma que os dados do índice ao longo do eixo especificado em ordem classificada.
Considere um exemplo em python, com uma lista de valores como
Agora usamos a função argsort:
A saída será
Esta é a lista de índices de valores em listExample, se você mapear esses índices para os respectivos valores, obteremos o resultado da seguinte forma:
(Eu acho essa função muito útil em muitos lugares, por exemplo, se você deseja classificar a lista / matriz, mas não deseja usar a função list.sort () (ou seja, sem alterar a ordem dos valores reais na lista), você pode usar isso função.)
Para obter mais detalhes, consulte este link: https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.argsort.html
fonte
input:
import numpy como np
x = np.array ([1.48,1.41,0.0,0.1])
x.argsort (). argsort ()
saída:
matriz ([3, 2, 0, 1])
fonte
Primeiro, foi ordenada a matriz. Em seguida, gere uma matriz com o índice inicial da matriz.
fonte
np.argsort retorna o índice da matriz classificada dada pelo 'kind' (que especifica o tipo de algoritmo de classificação). No entanto, quando uma lista é usada com np.argmax, ele retorna o índice do maior elemento da lista. Enquanto, np.sort, classifica a matriz, lista.
fonte
Só quero contrastar diretamente o entendimento original do OP em relação à implementação real com o código.
numpy.argsort
é definido de modo que, para matrizes 1D:O OP originalmente pensava que estava definido de tal forma que, para as matrizes 1D:
Nota: Este código não funciona no caso geral (funciona apenas para 1D), esta resposta é meramente ilustrativa.
fonte
x[x.argsort()]
não é necessariamente o mesmo quenp.sort(x)
. Na verdade, não é necessariamente nem a mesma forma. Tente isso com uma matriz 2D. Isso acontece apenas com matrizes 1D.Ele retorna índices de acordo com os índices de matriz fornecidos
[1.48,1.41,0.0,0.1]
, ou seja:0.0
é o primeiro elemento, no índice [2].0.1
é o segundo elemento, no índice [3].1.41
é o terceiro elemento, no índice [1].1.48
é o quarto elemento, no índice [0]. Resultado:fonte