Python 如何仅从数组返回一次重复项?

Python 如何仅从数组返回一次重复项?,python,arrays,numpy,Python,Arrays,Numpy,我有一个大数组,其中一部分看起来像这样 ... [u'3767' u'SS14 3HG'] [u'3768' u'SS14 3HG'] [u'3769' u'SS14 3HG'] [u'3770' u'SS14 3HG'] [u'3771' u'SS14 3HG'] [u'3772' u'SS14 3HG'] [u'4300' u'TA1 4DY'] [u'4301' u'TA1 4DY'] [u'4302' u'TA1 4DY'] [u'4303' u'TA1 4DY']

我有一个大数组,其中一部分看起来像这样

...
 [u'3767' u'SS14 3HG']
 [u'3768' u'SS14 3HG']
 [u'3769' u'SS14 3HG']
 [u'3770' u'SS14 3HG']
 [u'3771' u'SS14 3HG']
 [u'3772' u'SS14 3HG']
 [u'4300' u'TA1 4DY']
 [u'4301' u'TA1 4DY']
 [u'4302' u'TA1 4DY']
 [u'4303' u'TA1 4DY']
 [u'4304' u'TA1 4DY']
 ...
如您所见,第二列中的项目重复多次。我需要能够从第1列中仅获取每个重复项的单个实例及其对应的编号。例如:

#output
[u'3767' u'SS14 3HG']
[u'4300' u'TA1 4DY']
我最初认为可以创建一个for循环,检查当前项是否与下一项相同,如果相同,则返回该项并删除下一项。但是,

我会得到一个索引越界错误

b这不是很贵吗


有什么想法吗

如果它们已经像那样分组在一起,您可以使用itertools.groupby

例如:

如果它们没有分组,因为您不关心从第一列中获取的项目,您可以通过dict运行这些项目:

>>> [[v,k] for k,v in {k:v for v,k in your_list}.items()]
[[u'4304', 'TA1 4DY'], [u'3772', 'SS14 3HG']]
您可以使用获取数组第二列中第一次出现的条目的索引:

>>> indexes = np.unique(myarr[:,1], return_index=True)
(array([u'SS14 3HG', u'TA1 4DY'], 
  dtype='<U8'), array([0, 6]))

如果性能是您主要关心的问题,并且项目已经分组,那么有一个简单而快速的numpy解决方案:

import numpy as np

data = np.array([
 [u'3767', u'SS14 3HG'],
 [u'3768', u'SS14 3HG'],
 [u'3769', u'SS14 3HG'],
 [u'3770', u'SS14 3HG'],
 [u'3771', u'SS14 3HG'],
 [u'3772', u'SS14 3HG'],
 [u'4300', u'TA1 4DY'],
 [u'4301', u'TA1 4DY'],
 [u'4302', u'TA1 4DY'],
 [u'4303', u'TA1 4DY'],
 [u'4304', u'TA1 4DY'],
])

items, groups = data.T
flags = np.concatenate(([True], groups[1:]!=groups[:-1]))

print items[flags,0]
如果确实不需要,则可以通过这种方式避免np.unique在内部执行排序

或者,如果下载代码,您可以编写:

group_by(groups).first(items)

与np.unique解决方案具有相同的特征,但语法更清晰。

u'SS14 3HG'有几个对应的数字:您想只显示其中一个还是全部?@Begueradj我想您误解了;我所说的对应数字是指第1列中与第2列中的项目位于同一行的数字是的,我知道,但在第一列中,有几个对应的数字代表u'SS14 3HG':所以你想随机列出它们全部还是只列出其中一个?@Beguer Adj Oh我明白你的意思。不是所有的,任何一个都可以。它们很可能组合在一起:引用OP:我可以创建一个for循环来检查当前项是否与nextYes相同,它们都是这样组合在一起的。这是一个很好的答案,但因为我更熟悉ajcr答案中提供的方法,所以我选择了这个方法。然而,由于我最终将寻求提高我的程序的性能,你知道你的方法是否比ajcr的更快吗?我想我会在某个时候测试一下,然后自己看看。没问题,很高兴答案对你有用。
>>> myarr[indexes[1]]
array([[u'3767', u'SS14 3HG'],
       [u'4300', u'TA1 4DY']], 
      dtype='<U8')
import numpy as np

data = np.array([
 [u'3767', u'SS14 3HG'],
 [u'3768', u'SS14 3HG'],
 [u'3769', u'SS14 3HG'],
 [u'3770', u'SS14 3HG'],
 [u'3771', u'SS14 3HG'],
 [u'3772', u'SS14 3HG'],
 [u'4300', u'TA1 4DY'],
 [u'4301', u'TA1 4DY'],
 [u'4302', u'TA1 4DY'],
 [u'4303', u'TA1 4DY'],
 [u'4304', u'TA1 4DY'],
])

items, groups = data.T
flags = np.concatenate(([True], groups[1:]!=groups[:-1]))

print items[flags,0]
group_by(groups).first(items)