假设我有一个数组a = np.array([1, 2, 1, 3, 3, 3, 0])
我如何(有效地,pythonical地)找到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万大小)上保持高效。
结论
使用1000万大小的数据集(在2.8GHz Xeon上)进行测试:a = np.random.randint(10**7, size=10**7)
360s时减法
我将使用排序来表现,但我接受史蒂文的回答,因为表现是可以接受的,而且感觉更清晰、更像Python。
编辑:发现了熊猫解决方案。如果熊猫是可用的,它是明确的,表现良好。