符合逻辑或在Pandas面具列表上

2024-09-27 07:20:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个布尔掩码列表,通过对数据帧应用不同的搜索条件获得。下面是一个包含4个掩码的示例列表:

mask_list = [mask1, mask2, mask3, mask4]

我想找到列表中所有掩码的逻辑or。换句话说

^{pr2}$

对于包含任意数量掩码的列表,有没有一种简洁的方法来实现这一点?我知道我可以写一个for循环,如下所示,但是有没有一种更短、更具Python式风格的方法来实现这一点呢?在

for i in range(len(mask_list)):
    if i == 0:
        temp_mask_or = mask_list[i]
    else:
        temp_mask_or = temp_mask_or | mask_list[i]

Tags: or数据方法示例列表formask条件
2条回答

我通常在组合蒙版时使用与您类似的循环,可能稍有不同:

combmask = mask_list[0]
for mask in mask_list[1:]:
    combmask |= mask

如果这还不够短,你可以利用你只是使用面具这一事实,并将它们视为int(它们在引擎盖下面):

^{pr2}$

如果你看一下sum(mask_list),你会发现它只是一个整数列表。在

关于后一种方法,我不知道的一个可能的警告是,当您试图求和超过255个掩码时,它是否会遇到问题,其中至少有一个(相同的)元素总是True(即1)。存储np.bool的底层整数类型只有8位,这样就可以达到整数限制。也许numpy/Python在继续之前会自动将所有内容转换为16位整数类型,但我不知道这一点。在


编辑:我会留下后一项,但很容易检查:

In [51]: len(mask_list)
Out[51]: 4

In [52]: sum(mask_list).dtype
Out[52]: dtype('int64')

因此,即使是一个短的掩码列表的总和也被转换成64位整数(然后可以很容易地将其转换为布尔掩码数组),并且您不会轻易地遇到整数限制。在

您可以使用reduce:

or_(x,y)表示x|y,因此这将起作用:

from operator import or_
or_mask = reduce(or_,mask_list)

编辑:正如JoeCondron建议的那样,您可以使用operator.or_代替numpy.logical_or,这会产生相同的结果,但速度更快。在

相关问题 更多 >

    热门问题