python3 数组重复数字_确定数组中的重复值

假设我有一个数组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。

编辑:发现了熊猫解决方案。如果熊猫是可用的,它是明确的,表现良好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值