NumPy:比较两个数组中的元素

47 投票
6 回答
85415 浏览
提问于 2025-04-15 15:18

有没有人遇到过这个问题?假设你有两个数组,像下面这样:

a = array([1,2,3,4,5,6])
b = array([1,4,5])

有没有办法比较一下数组a里面的元素哪些在数组b里面也存在?比如说:

c = a == b # Wishful example here
print c
array([1,4,5])
# Or even better
array([True, False, False, True, True, False])

我想避免使用循环,因为如果有几百万个元素,那样会花很长时间。有什么好主意吗?

谢谢!

6 个回答

3

谢谢你的回复,kaizer.se。虽然这不是我想要的答案,但在朋友的建议和你说的基础上,我想出了以下内容。

import numpy as np

a = np.array([1,4,5]).astype(np.float32)
b = np.arange(10).astype(np.float32)

# Assigning matching values from a in b as np.nan
b[b.searchsorted(a)] = np.nan

# Now generating Boolean arrays
match = np.isnan(b)
nonmatch = match == False

这个过程有点繁琐,但总比写循环或者用循环来编织要好。

谢谢!

25

使用 np.intersect1d。

#!/usr/bin/env python
import numpy as np
a = np.array([1,2,3,4,5,6])
b = np.array([1,4,5])
c=np.intersect1d(a,b)
print(c)
# [1 4 5]

注意,如果 a 或 b 中有重复的元素,np.intersect1d 会给出错误的结果。在这种情况下,使用 np.intersect1d_nu。

还有 np.setdiff1d、setxor1d、setmember1d 和 union1d。可以查看 Numpy 示例列表及文档

62

其实,这里有一个比这些方法更简单的解决方案:

import numpy as np

a = array([1,2,3,4,5,6])
b = array([1,4,5])

c = np.in1d(a,b)

得到的 c 就是:

array([ True, False, False,  True,  True, False], dtype=bool)

撰写回答