Numpy有一个函数numpy.setmember1d(),可以用于已排序且去重的数组,返回你所需的布尔数组。如果输入数组不符合条件,则需要将其转换为set格式并对结果进行反转换。
import numpy as np
a = np.array([6,1,2,3,4,5,6])
b = np.array([1,4,5])
a_set, a_inv = np.unique1d(a, return_inverse=True)
b_set = np.unique1d(b)
matches = np.setmea_set, b_set)
result = matches[a_inv]
print(result)
编辑:很遗憾,numpy中的setmember1d方法非常低效。您提议的搜索排序和分配方法速度更快,但是如果可以直接分配结果,最好直接分配结果并避免大量不必要的复制。此外,如果b包含a中没有的任何内容,则您的方法将失败。以下纠正了这些错误:
result = np.zeros(a.shape, dtype=np.bool)
idxs = a.searchsorted(b)
idxs = idxs[np.where(idxs < a.shape[0])]
idxs = idxs[np.where(a[idxs] == b)]
result[idxs] = True
print(result)
我的基准测试显示,使用您的方法需要6.6毫秒,而使用numpy setmember1d在1M个元素a和100个元素b上需要109毫秒,而我的方法只需要91微秒。