59
['b','b','b','a','a','c','c']

numpy.unique 给出

['a','b','c']

我怎样才能保留原始订单

['b','a','c']

很好的答案。奖金问题。为什么这些方法都不适用于这个数据集?http://www.uploadmb.com/dw.php?id=1364341573这是问题numpy sort wierd behavior

4

7 回答 7

93

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
于 2013-03-26T12:50:33.547 回答
25

使用 的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')
于 2013-03-26T12:49:35.853 回答
8
a = ['b','b','b','a','a','c','c']
[a[i] for i in sorted(np.unique(a, return_index=True)[1])]
于 2013-03-26T12:44:43.173 回答
3

如果您尝试删除已排序的可迭代对象的重复项,则可以使用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']
于 2013-03-26T12:54:47.070 回答
2
#List we need to remove duplicates from while preserving order

x = ['key1', 'key3', 'key3', 'key2'] 

thisdict = dict.fromkeys(x) #dictionary keys are unique and order is preserved

print(list(thisdict)) #convert back to list

output: ['key1', 'key3', 'key2']
于 2020-11-16T17:52:12.257 回答
1

如果你想删除重复的条目,比如 Unix tool 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]
于 2015-07-10T13:40:45.160 回答
1

使用 OrderedDict(比列表理解更快)

from collections import OrderedDict  
a = ['b','a','b','a','a','c','c']
list(OrderedDict.fromkeys(a))
于 2019-09-17T16:21:14.510 回答