python numpy

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])]