Python 中的逻辑掩码

logical masking in Python

在 Matlab 中,大量使用内置的逻辑索引和掩码机制是很自然的。例如, (1) idx = (A == 2) 创建一个与 A 大小相同的逻辑数组,标识所有等于 2 的元素,并且 (2) C = B(idx)B 中取出所有对应的元素,假设 AB 的大小相同。

这个机制非常优雅而且非常高效。无论 AB 的维数如何,它都有效。在 Matlab 中,使用逻辑掩码比以数字方式提取索引更有效。我刚刚开始学习 Python,它以不同的方式处理所有事情。标准 Python 3(不安装 NumPy 等)中最接近 (1) 和 (2) 的是什么?

这将函数应用于集合的所有元素。内置的方法是 map 和理解(map(lambda x: x==2, A)[x==2 for x in A])。如果您想将函数应用于随机嵌套列表,则必须自己扩展 map

def is_two(x):  # more readable than the lambda
    return x == 2

def map_nested(fnc, lst):
    if not isinstance(lst, list):
        return fnc(lst)
    return [map_nested(fnc, x) for x in lst]

A = [[1,2,3], [2,3,4], 1, 2]
map_nested(is_two, A)
#[[False, True, False], [True, False, False], False, True]