python - transpuesta - numpy tutorial español pdf
Cómo obtener índices de una matriz ordenada en Python (6)
Algo como el siguiente:
>>> myList = [1, 2, 3, 100, 5]
>>> [i[0] for i in sorted(enumerate(myList), key=lambda x:x[1])]
[0, 1, 2, 4, 3]
enumerate(myList)
le da una lista que contiene tuplas de (índice, valor):
[(0, 1), (1, 2), (2, 3), (3, 100), (4, 5)]
Puede ordenar la lista pasándola para sorted
y especificar una función para extraer la clave de clasificación (el segundo elemento de cada tupla; para eso está el lambda
. Finalmente, el índice original de cada elemento ordenado se extrae utilizando [i[0] for i in ...]
list comprehension.
Tengo una lista numérica:
myList = [1, 2, 3, 100, 5]
Ahora si ordeno esta lista para obtener [1, 2, 3, 5, 100]
. Lo que quiero es los índices de los elementos de la lista original en el orden ordenado, es decir [0, 1, 2, 4, 3]
--- ala función de clasificación de MATLAB que devuelve valores e índices.
Las respuestas con enumerate
son agradables, pero personalmente no me gusta el lambda utilizado para ordenar por el valor. Lo siguiente simplemente invierte el índice y el valor, y ordena eso. Por lo tanto, primero se ordenará por valor, luego por índice.
sorted((e,i) for i,e in enumerate(myList))
Respuesta actualizada con enumerate
y itemgetter
:
sorted(enumerate(a), key=lambda x: x[1])
# [(0, 1), (1, 2), (2, 3), (4, 5), (3, 100)]
Comprima las listas juntas: el primer elemento de la tupla será el índice, el segundo es el valor (luego, ordénelo usando el segundo valor de la tupla x[1]
, x es la tupla)
O usando itemgetter
del itemgetter
de operator
:
from operator import itemgetter
sorted(enumerate(a), key=itemgetter(1))
Si no quieres usar numpy,
sorted(range(len(seq)), key=seq.__getitem__)
es el más rápido, como se demuestra here .
Si usa numpy, tiene la función argsort () disponible:
>>> import numpy
>>> numpy.argsort(myList)
array([0, 1, 2, 4, 3])
http://docs.scipy.org/doc/numpy/reference/generated/numpy.argsort.html
Esto devuelve los argumentos que ordenarían la matriz o lista.
In [15]: myList = [1, 2, 3, 100, 5]
In [16]: sorted(range(len(myList)),key=lambda x:myList[x])
Out[16]: [0, 1, 2, 4, 3]
También:
sorted(range(len(myList)),key=myList.__getitem__)