将索引列表转换为布尔掩码的快速方法

Fast way of turning a list of indexes into a boolean mask

这是一个非常简单的问题,但我还没有找到简单的答案。假设你有一个大数组,该数组的索引列表,你想使用这些索引生成一个布尔掩码。

import numpy as np

# A large array
arr = np.random.uniform(0., 1., 500000)

# A list of indexes (much larger in real code)
idx = [89, 3455, 3, 26789]

# The boolean mask
msk = []
for _ in range(len(arr)):
    if _ in idx:
        msk.append(True)
    else:
        msk.append(False)
msk = np.array(msk)

上面的 for 块可以工作,但对于大型 idx 数组会变慢。实现这一目标的快速方法是什么?我知道 np.where() can be used 相反(布尔值到索引),它也可以在这里使用吗?

有一种更简单的方法可以使用 numpy 零和索引来执行此操作。

msk = np.zeros(arr.shape, dtype=np.bool)
msk[idx] = True

对大数组很有效