这适用于二维矩阵:
import numpy as np
from scipy import signal
A = (np.random.normal(0, 1, 64) > 1).reshape(8, 8)
k = np.array([[0, 0, 0], [0, 0, 1], [0, 1, 0]])
B = np.minimum(signal.convolve2d(A, k, mode='same'), 1)
给予:
>>> A
array([[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 1, 0, 0],
[0, 0, 1, 0, 0, 1, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 1, 0]])
>>> B
array([[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 1, 1, 0, 0, 1, 0],
[0, 1, 0, 1, 0, 1, 1, 0],
[0, 1, 1, 0, 0, 1, 0, 0],
[1, 0, 0, 0, 0, 0, 1, 1]])
可以类似地将其扩展到 N-D 矩阵。
from scipy import ndimage
A = (np.random.normal(0, 1, 64) > 1).reshape(8, 8)
k = np.array([
[[0, 0, 0], [0, 1, 0], [0, 0, 0]],
[[0, 1, 0], [1, 0, 0], [0, 0, 0]],
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]])
B = np.minimum(ndimage.correlate(A, k, mode='constant'), 1)
给予:
>>> A
array([[[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]],
[[0, 0, 0, 0],
[1, 0, 0, 0],
[0, 0, 0, 1],
[0, 0, 0, 0]],
[[0, 1, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 1, 0, 0]],
[[1, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 1, 1, 0]]])
>>> B
array([[[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]],
[[0, 0, 0, 0],
[0, 1, 0, 0],
[1, 0, 0, 0],
[0, 0, 0, 1]],
[[0, 0, 1, 0],
[1, 1, 1, 0],
[0, 1, 0, 1],
[0, 0, 1, 0]],
[[0, 1, 0, 0],
[1, 1, 0, 0],
[0, 0, 1, 0],
[0, 1, 1, 1]]])
完成!
验证上述代码正确性的一个简单方法是在这样的矩阵上运行它:
A = np.zeros((4, 4, 4), int)
A[0, 1, 2] = 1
这会产生预期的结果:
>>> A
array([[[0, 0, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]],
[[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]],
[[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]],
[[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]])
>>> B
array([[[0, 0, 0, 0],
[0, 0, 0, 1],
[0, 0, 1, 0],
[0, 0, 0, 0]],
[[0, 0, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]],
[[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]],
[[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]])