subplot title python
numpy.unique con orden preservada (5)
Si desea eliminar entradas repetidas, como la herramienta unix de Unix, esta es una solución:
def uniq(seq):
"""
Like Unix tool uniq. Removes repeated entries.
:param seq: numpy.array
:return: seq
"""
diffs = np.ones_like(seq)
diffs[1:] = seq[1:] - seq[:-1]
idx = diffs.nonzero()
return seq[idx]
[''b'',''b'',''b'',''a'',''a'',''c'',''c'']
numpy.unique da
[''a'',''b'',''c'']
¿Cómo puedo obtener la orden original preservada?
[''b'',''a'',''c'']
Grandes respuestas. Pregunta extra. ¿Por qué ninguno de estos métodos funciona con este conjunto de datos? http://www.uploadmb.com/dw.php?id=1364341573 Aquí está la pregunta numpy sort wierd behavior
Si está tratando de eliminar la duplicación de un iterable ya ordenado, puede usar la función itertools.groupby
:
>>> from itertools import groupby
>>> a = [''b'',''b'',''b'',''a'',''a'',''c'',''c'']
>>> [x[0] for x in groupby(a)]
[''b'', ''a'', ''c'']
Esto funciona más como el comando ''uniq'' de unix, porque asume que la lista ya está ordenada. Cuando lo intentes en una lista desordenada obtendrás algo como esto:
>>> b = [''b'',''b'',''b'',''a'',''a'',''c'',''c'',''a'',''a'']
>>> [x[0] for x in groupby(b)]
[''b'', ''a'', ''c'', ''a'']
Use la funcionalidad np.unique
de np.unique
. Eso devuelve los índices a los que los elementos primero ocurrieron en la entrada. Entonces argsort
esos índices.
>>> u, ind = np.unique([''b'',''b'',''b'',''a'',''a'',''c'',''c''], return_index=True)
>>> u[np.argsort(ind)]
array([''b'', ''a'', ''c''],
dtype=''|S1'')
unique()
es lento, O (Nlog (N)), pero puede hacerlo siguiendo el siguiente código:
import numpy as np
a = np.array([''b'',''a'',''b'',''b'',''d'',''a'',''a'',''c'',''c''])
_, idx = np.unique(a, return_index=True)
print(a[np.sort(idx)])
salida:
[''b'' ''a'' ''d'' ''c'']
Pandas.unique()
es mucho más rápido para la gran matriz O (N):
import pandas as pd
a = np.random.randint(0, 1000, 10000)
%timeit np.unique(a)
%timeit pd.unique(a)
1000 loops, best of 3: 644 us per loop
10000 loops, best of 3: 144 us per loop
a = [''b'',''b'',''b'',''a'',''a'',''c'',''c'']
[a[i] for i in sorted(np.unique(a, return_index=True)[1])]