Numpy.unique с сохраненным порядком
['b','b','b','a','a','c','c']
numpy.unique дает
['a','b','c']
Как мне сохранить первоначальный заказ
['b','a','c']
Отличные ответы. Бонусный вопрос. Почему ни один из этих методов не работает с этим набором данных? http://www.uploadmb.com/dw.php?id=1364341573 Здесь вопрос о тупой сортировке странного поведения
Ответы
Ответ 1
unique()
медленно, O (Nlog (N)), но вы можете сделать это с помощью следующего кода:
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)])
выход:
['b' 'a' 'd' 'c']
Pandas.unique()
намного быстрее для большого массива 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
Ответ 2
Используйте return_index
функциональность np.unique
. Это возвращает индексы, в которых элементы сначала попадали на вход. Тогда argsort
те индексы.
>>> u, ind = np.unique(['b','b','b','a','a','c','c'], return_index=True)
>>> u[np.argsort(ind)]
array(['b', 'a', 'c'],
dtype='|S1')
Ответ 3
a = ['b','b','b','a','a','c','c']
[a[i] for i in sorted(np.unique(a, return_index=True)[1])]
Ответ 4
Если вы пытаетесь удалить дублирование уже отсортированного итерации, вы можете использовать функцию itertools.groupby
:
>>> from itertools import groupby
>>> a = ['b','b','b','a','a','c','c']
>>> [x[0] for x in groupby(a)]
['b', 'a', 'c']
Это больше похоже на unix 'uniq', потому что он предполагает, что список уже отсортирован. Когда вы попробуете его в несортированном списке, вы получите что-то вроде этого:
>>> b = ['b','b','b','a','a','c','c','a','a']
>>> [x[0] for x in groupby(b)]
['b', 'a', 'c', 'a']
Ответ 5
Если вы хотите удалить повторяющиеся записи, например, инструмент Unix uniq
, это решение:
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]
Ответ 6
Используйте OrderedDict (быстрее, чем понимание списка)
from collections import OrderedDict
a = ['b','a','b','a','a','c','c']
list(OrderedDict.fromkeys(a))