我想确定我的列表(实际上是一个numpy.ndarray)是否在最快的执行时间内包含重复项。请注意,我不在乎删除副本,我只是想知道是否有副本。
注意:如果这不是一个副本,我会非常惊讶,但我已经尽力了,找不到了。最近的是这个问题和这个问题,这两个问题都要求返回唯一列表。
你的意思是"快速"地写代码(并且,大概,在六个月后你读的时候很快地理解它),还是快速执行?
此外,如果可以接受误报,您可能需要使用Bloom过滤器(我非常确定有一些基于numpy的好实现)。即使不接受假阳性,也可能更快(当然也需要更少的内存),首先运行Bloom过滤器,然后使用集合或np.unique检查可能的唯一性。
我的问题是关于执行速度,但当然,不可理解的代码并不是任何人最好的朋友。布卢姆过滤器是一个非常有趣的方法!
为了更好地看待替代方案,np.unique做了一个sort,并寻找成对的差异。如果重复次数非常少,以至于短路方法以任何方式扫描阵列的大部分,那么这可能是最好的方法。
数组中的值类型是什么?也就是说,什么是arr.dtype?
@沃伦,我都没想过。我的数组包含30000个长度小于20的np.str。我想这可能会大大改变性能。
这是我想用的四种方法。
tl;dr:如果您期望很少(少于1/1000)个副本:
def contains_duplicates(X):
return len(np.unique(X)) != len(X)
如果您希望经常(超过1/1000)重复:
def contains_duplicates(X):
seen = set()
seen_add = seen.add
for x in X:
if (x in seen or seen_add(x)):
return True
return False
第一种方法是提前退出这个答案,它希望返回唯一的值,第二种方法是应用于这个答案的相同思想。
>>> import numpy as np
>>> X = np.random.normal(0,1,[10000])
>>> def terhor