如何在没有 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]])
我正在尝试从断点对数组创建布尔掩码数组。所以结果应该是长度为 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]])