当前位置: 首页 > 面试题库 >

确定数组中的重复值

罗睿识
2023-03-14
问题内容

假设我有一个数组

a = np.array([1, 2, 1, 3, 3, 3, 0])

如何(有效地,以Python方式)找到a重复的元素(即非唯一值)?在这种情况下,结果将是有效的,array([1, 3, 3])或者可能array([1, 3])是有效的。

我想出了一些可行的方法:

掩蔽

m = np.zeros_like(a, dtype=bool)
m[np.unique(a, return_index=True)[1]] = True
a[~m]

设定操作

a[~np.in1d(np.arange(len(a)), np.unique(a, return_index=True)[1], assume_unique=True)]

这个很可爱,但可能是非法的(a实际上并不是唯一的):

np.setxor1d(a, np.unique(a), assume_unique=True)

直方图

u, i = np.unique(a, return_inverse=True)
u[np.bincount(i) > 1]

排序

s = np.sort(a, axis=None)
s[:-1][s[1:] == s[:-1]]

大熊猫

s = pd.Series(a)
s[s.duplicated()]

有什么我想念的吗?我不一定要寻找仅numpy的解决方案,但它必须与numpy数据类型一起使用,并且必须在中等大小的数据集(最大1000万个大小)上有效。

结论

使用一千万个大小的数据集(在2.8GHz Xeon上)进行测试

a = np.random.randint(10**7, size=10**7)

最快的是排序,速度为1.1秒。可疑xor1dSeries.duplicated以2.6秒排名第二,其次是面具和熊猫,分别bincount为3.1秒in1d和5.6秒,以及哨兵的setdiff1d两者均为7.3秒。史蒂文的Counter速度稍慢一点,为10.5秒。紧随其后的是Burhan的Counter.most_common110年代和DSM的Counter减法360年代。

我将使用排序来提高性能,但我接受Steven的回答,因为性能是可以接受的,并且 感觉 更加清晰和Pythonic。

编辑:发现了熊猫解决方案。如果有Pandas可用,那就很清楚并且表现良好。


问题答案:

我认为这是在之外最明确的做法numpynumpy如果您担心速度,则必须将其与解决方案放在一起。

>>> import numpy as np
>>> from collections import Counter
>>> a = np.array([1, 2, 1, 3, 3, 3, 0])
>>> [item for item, count in Counter(a).items() if count > 1]
[1, 3]

注意: 这与Burhan Khalid的答案类似,但items在这种情况下不带下标的使用应更快。



 类似资料:
  • 我想创建一个数组,使其包含一些标识名,并且对于这些名称中的每一个,都有另一个关联的数组。我的做法是,, 执行此操作后,我得到如下结果:, 下次调用此函数时,我需要检查1-1是否存在,如果存在,我需要获取与1-1相关的列表。我该怎么做。。?如果1-1不在myArray中,我将调用其他函数。

  • 我试图用ng repeat in Angular来重复一个多维数组的子数组。我的json对象是这样的: 我尝试了这样的东西: 然后在这个孩子的表中:

  • 对朱莉娅来说是新来的,所以这可能很容易。 我有一个n×m的数组和一个长度为n的向量,我想在向量的对应元素中重复数组的每一行的次数。例如: 结果应该是6乘6的数组。我尝试了功能,但是 生成一个数组,因此需要作为重复元素的维度。在matlab中,我会使用,我希望julia提供类似的东西。我的实际矩阵要大得多,我需要多次调用该函数,所以这个操作需要尽可能快。

  • 在《计算机系统:程序员的视角》一书中,练习5.5显示了一段计算多项式值的代码 本练习假设双精度浮点加法和乘法所需的时钟周期分别为3和5。读者被要求解释为什么测量的CPE(每元素周期)值为5。 根据练习答案,在每次迭代中,我们需要更新变量xpwr和result,我们需要的操作是浮点加法(对于结果)和浮点乘法(对于xpwr),因此后者控制延迟,导致最终CPE为5。 但我认为数据流应该是这样的: 所以最

  • 我试图确定数组中的位置。我真的不确定如何处理这种情况

  • 我有一个数组。如何按类型、名称和大小以及递增量找到双重许可。增加数量后删除相同的。