以下是我所拥有的:
long_list=整数值的非常长的列表(6M+个条目(
wanted_list=感兴趣的整数值列表(70K个条目(
我需要什么:
mask_list=长度与long_list相同的布尔值列表,描述long_list的每个元素是否存在于wanted_list中(即[是wanted_list[0]吗?中的long_list[1]吗?,…](。此列表中的"True"条目数应与len(wanted_lilist(相同
我使用for循环得到了一个工作代码,但正如预期的那样,对于我正在处理的列表的长度来说,它太慢了(需要几分钟的运行时间(:
masklist = []
for element in long_list:
if element in wanted_list:
masklist.append(True)
else:
masklist.append(False)
我想知道是否有一种更优雅、更快速的方式来实现这个目标?我正在研究numpy.ma模块,但想不出一种优雅的方法来将其应用于这个问题
您可以使用numpy.isin
进行以下操作:
masklist = np.isin(long_list, wanted_list)
这很慢,因为算法的复杂度很低(O(n²)
(。这可以在O(n)
:中完成
wanted_set = set(wanted_list)
masklist = [element in wanted_set for element in long_list]
如果您在Numpy数组上操作,那么您可以使用np.unique
和np.searchsorted
,但它将在O(n log n)
时间内计算。对于小型阵列(由于Numpy实现(,它可能更快,但对于大型阵列(由于复杂性和低效的缓存访问(则不然。CCD_ 7也可能是有用的并且可能更快。