如何在没有 for 循环的情况下从两个断点创建长度为 n 的布尔掩码?

How do I create a boolean mask of length n from two breakpoints without a for loop?

我正在尝试从断点对数组创建布尔掩码数组。所以结果应该是长度为 n 的布尔掩码,在两个断点之间具有真值。我可以通过编写 for 循环迭代地解决问题,但我想找出它的矢量化 numpy 等价物。

mask = np.array([[False, False, False, False, False],
                 [False, False, False, False, False]])
breakpoints = np.array([[1, 3],
                        [2, 4]])
for i, bp in enumerate(breakpoints):
    mask[i, bp[0]:bp[1]] = True

输出:

array([[False,  True,  True, False, False],
       [False, False,  True,  True, False]])

最理想的情况是,我想通过 numpy 中的索引和数组操作来解决这个问题,但我想不出正确的方法。

我希望这个例子很清楚,感谢您的帮助!

您可以使用以下技巧:

>>> breakpoints = np.array([[1, 3],
...                         [2, 4]])
>>> output_width = 5
>>> idx = np.arange(output_width)
>>> (breakpoints[:,[0]] <= idx) & (idx < breakpoints[:,[1]])
array([[False,  True,  True, False, False],
       [False, False,  True,  True, False]])