Quiero eliminar las tuplas redundantes pero conservar el orden de aparición. Miré preguntas similares. Esta pregunta Buscar filas únicas en numpy.array parecía muy prometedora, pero de alguna manera no funcionó para mí.
Podría usar pandas como en esta respuesta ( https://stackoverflow.com/a/14089586/566035 ) pero prefiero no usar pandas para que el ejecutable generado por py2exe sea pequeño.
import numpy as np
data = [('a','z'), ('a','z'), ('a','z'), ('1','z'), ('e','z'), ('c','z')]
#What I want is:
array([['a', 'z'],
['1', 'z'],
['e', 'z'],
['c', 'z']],
dtype='|S1')
#What I have tried:
# (1) numpy.unique, order not preserved
np.unique(data)
array([['a', 'z'],
['c', 'z'],
['1', 'z'],
['e', 'z']],
dtype='|S1')
# (2) python set, order not preserved
set(data)
set([('1', 'z'), ('a', 'z'), ('c', 'z'), ('e', 'z')])
# (3) answer here: https://stackoverflow.com/a/16973510/566035, order not preserved
a = np.array(data)
b = np.ascontiguousarray(a).view(np.dtype((np.void, a.dtype.itemsize * a.shape[1])))
_, idx = np.unique(b, return_index=True)
a[idx]
array([['1', 'z'],
['a', 'z'],
['c', 'z'],
['e', 'z']],
dtype='|S1')
Solución del problema
Esto no es excelente en términos de eficiencia, pero es un código legible muy simple y puede funcionar para listas más pequeñas:
sorted(set(data), key=data.index)
No hay comentarios.:
Publicar un comentario