subplot title python
Numpy Ășnico sin ordenar (2)
Puedes hacer esto con el parámetro return_index
:
>>> import numpy as np >>> a = [4,2,1,3,1,2,3,4] >>> np.unique(a) array([1, 2, 3, 4]) >>> indexes = np.unique(a, return_index=True)[1] >>> [a[index] for index in sorted(indexes)] [4, 2, 1, 3]
Esta pregunta ya tiene una respuesta aquí:
- numpy.unique con orden conservada 5 respuestas
¿Cómo puedo usar numpy unique sin ordenar el resultado pero solo en el orden en que aparecen en la secuencia? ¿Algo como esto?
a = [4,2,1,3,1,2,3,4]
np.unique(a) = [4,2,1,3]
más bien que
np.unique(a) = [1,2,3,4]
Usar una solución ingenua debería estar bien para escribir una función simple. Pero como tengo que hacer esto varias veces, ¿hay alguna forma rápida y ordenada de hacerlo?
Puedes hacer esto usando numpy haciendo algo como esto, el mergsort es estable así que te permitirá elegir la primera o la última ocurrencia de cada valor:
def unique(array, orderby=''first''):
array = np.asarray(array)
order = array.argsort(kind=''mergesort'')
array = array[order]
diff = array[1:] != array[:-1]
if orderby == ''first'':
diff = np.concatenate([[True], diff])
elif orderby == ''last'':
diff = np.concatenate([diff, [True]])
else:
raise ValueError
uniq = array[diff]
index = order[diff]
return uniq[index.argsort()]
Esta respuesta es muy similar a:
def unique(array):
uniq, index = np.unique(array, return_index=True)
return uniq[index.argsort()]
Pero, numpy.unique usa una clasificación inestable internamente, por lo que no está garantizado que obtenga ningún índice específico, es decir, el primero o el último.
Creo que un dict ordenado también podría funcionar:
def unique(array):
uniq = OrderedDict()
for i in array:
uniq[i] = 1
return uniq.keys()