围绕索引创建掩码数组的 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 指出边缘情况。 maximum
和 minimum
确保索引不会(无意中)超出范围。
您可以使用带 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])
我有一个一维数组:
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 指出边缘情况。 maximum
和 minimum
确保索引不会(无意中)超出范围。
您可以使用带 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])