您可以使用布尔掩码来定义决策数组。让我们通过一个具体的例子来工作。您有一个正数和负数数组,并且您只想在正数位置取平方根:
arr = np.random.normal(size=100)
你计算一个类似的掩码
mask = arr >= 0
应用掩码最直接的方法是创建一个输出数组,并填写所需的元素:
result = np.empty(arr.shape)
result[mask] = np.sqrt(arr[mask])
result[~mask] = arr[~mask]
这不是超级高效,因为您必须计算掩码的逆并多次应用它。对于这个特定示例,您可以利用 np.sqrt 是 ufunc 的事实并使用其 where keyword:
result = arr.copy()
np.sqrt(arr, where=mask, out=result)
应用蒙版的一种流行方法是使用np.where,但我特意构建了这个示例来说明注意事项。最简单的方法是计算
result = np.where(mask, np.sqrt(arr), arr)
where 根据mask 是否为真,从np.sqrt(arr) 或arr 中选择值。在许多情况下,这是一种非常好的方法,但您必须为两个分支预先计算值,这正是平方根要避免的。
TL;DR
您的具体示例是寻找掩码本身的表示。如果你不关心类型:
result = arr >= 0
如果您确实关心类型:
result = (arr >= 0).astype(int)
或
result = -np.clip(arr, -1, 0)
这些解决方案会创建与输入不同的数组。如果要替换同一缓冲区中的值,
mask = arr >= 0
arr[mask] = 1
arr[~mask] = 0