Python 中的逻辑掩码
logical masking in Python
在 Matlab 中,大量使用内置的逻辑索引和掩码机制是很自然的。例如,
(1) idx = (A == 2)
创建一个与 A
大小相同的逻辑数组,标识所有等于 2 的元素,并且
(2) C = B(idx)
从 B
中取出所有对应的元素,假设 A
和 B
的大小相同。
这个机制非常优雅而且非常高效。无论 A
和 B
的维数如何,它都有效。在 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]
在 Matlab 中,大量使用内置的逻辑索引和掩码机制是很自然的。例如,
(1) idx = (A == 2)
创建一个与 A
大小相同的逻辑数组,标识所有等于 2 的元素,并且
(2) C = B(idx)
从 B
中取出所有对应的元素,假设 A
和 B
的大小相同。
这个机制非常优雅而且非常高效。无论 A
和 B
的维数如何,它都有效。在 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]