创建一个长屏蔽列表(Python)



以下是我所拥有的:

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.uniquenp.searchsorted,但它将在O(n log n)时间内计算。对于小型阵列(由于Numpy实现(,它可能更快,但对于大型阵列(由于复杂性和低效的缓存访问(则不然。CCD_ 7也可能是有用的并且可能更快。

最新更新