围绕索引创建掩码数组的 Numpy 最快方法

Numpy fastest way to create mask array around indexes

我有一个一维数组:

arr = np.array([0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, 0, 2, 3, 0, 0, 1, ...], dtype='uint16')

我想创建一个 mask 数组,它是 True 任何大于 2 的 +/- N 索引,产生以下结果(对于 N=3)

mask = [F, T, T, T, T, T, T, T, F, F, T, T, T, T, T, T, T, F, F, F, T, T, T, T, T, T, T, ...]

(注意,为了便于阅读,我使用了 T/F

我需要这个速度相当快,因为​​我的实际数组有数百万个点长,N 可能是 500 个点。

编辑:

找到大于2的元素然后将它们周围的元素设置为True:

a = np.array([0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 3, 0, 0, 2, 0])

N = 3
mask = a > 2
center = np.where(mask)[0]
mask[np.maximum(np.ravel(center - np.arange(1, 1 + N).reshape(-1, 1)), 0)] = True
mask[np.minimum(np.ravel(center + np.arange(1, 1 + N).reshape(-1, 1)), len(a)-1)] = True

感谢@Michael Szczesny 指出边缘情况。 maximumminimum 确保索引不会(无意中)超出范围。

您可以使用带 numpy.convolve 的卷积和长度为 2*N+1(每边 N 加上自身)的数组作为掩码:

np.convolve(arr>2, np.ones(2*N+1), mode='same').astyoe(bool)

输出:

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