Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy.unique,保留顺序_Python_Numpy - Fatal编程技术网

Python numpy.unique,保留顺序

Python numpy.unique,保留顺序,python,numpy,Python,Numpy,独特的给予 ['b','b','b','a','a','c','c'] 我怎样才能保留原始订单 ['a','b','c'] 答案很好。奖金问题。为什么这些方法都不适用于此数据集?这里有一个问题使用np.unique的return\u索引功能。返回元素第一次出现在输入中的索引。然后argsort这些索引 a = ['b','b','b','a','a','c','c'] [a[i] for i in sorted(np.unique(a, return_index=True)[1])] u

独特的给予

['b','b','b','a','a','c','c']
我怎样才能保留原始订单

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


答案很好。奖金问题。为什么这些方法都不适用于此数据集?这里有一个问题

使用
np.unique
return\u索引
功能。返回元素第一次出现在输入中的索引。然后
argsort
这些索引

a = ['b','b','b','a','a','c','c']
[a[i] for i in sorted(np.unique(a, return_index=True)[1])]
unique()

>>> u, ind = np.unique(['b','b','b','a','a','c','c'], return_index=True)
>>> u[np.argsort(ind)]
array(['b', 'a', 'c'], 
      dtype='|S1')
输出:

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)])
Pandas.unique()
对于大数组O(N)要快得多:


如果您试图删除已排序iterable的重复项,可以使用
itertools.groupby
函数:

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
这更像unix“uniq”命令,因为它假定列表已经排序。当您在未排序的列表中尝试时,您将得到如下结果:

>>> 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']
使用OrderedICT(比列表理解更快)


几乎所有的时候,使用
numpy
可以更快地解决问题,因为
numpy
是专门的,所以纯python解决方案的速度会很慢。
O(N)
复杂性在任何地方都没有提到,因此只是一个实现细节。文档仅说明它比
numpy.unique
快得多,但这可能仅仅意味着它的常数更小,或者复杂度可能介于线性和NlogN之间。这里提到:如何使用
pandas.unique()
保持顺序?据我所知,它不允许任何参数。@F Lekschas,pandas.unique()似乎保留了默认的顺序。这只是公认答案的较慢版本。这只适用于数字。使用
=而不是
-
>>> from itertools import groupby
>>> a = ['b','b','b','a','a','c','c']
>>> [x[0] for x in groupby(a)]
['b', 'a', 'c']
>>> b = ['b','b','b','a','a','c','c','a','a']
>>> [x[0] for x in groupby(b)]
['b', 'a', 'c', 'a']
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]
from collections import OrderedDict  
a = ['b','a','b','a','a','c','c']
list(OrderedDict.fromkeys(a))
#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']