我有一个填充0和1的2D numpy数组,我想对其进行转换,以便将1附近的每个值转换为1(因此标题中的"污染")。
例如:
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 1 0 0 0
0 0 0 0 0 0
成为:
0 0 0 0 0 0
0 0 1 1 1 0
0 0 1 1 1 1
0 1 1 1 1 1
0 1 1 1 1 1
0 1 1 1 0 0
我可以通过循环遍历所有值,找到1,然后替换相邻值来实现此目的:
import numpy as np
ones = []
ar = np.array([[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,1,0,0,0],
[0,0,0,0,0,0]])
n_row, n_col = ar.shape
for i in range(n_row):
for j in range(n_col):
if ar[i][j] == 1:
ones.append((i, j))
for x,y in ones:
# Replace neighboring values
但这似乎有些过分(特别是因为我打算处理非常大的数组)。
有没有办法实现这一点而无需遍历所有值?
答案 0 :(得分:2)
那基本上是dilation operation in Image-processing domain
。因此,您可以使用Scipy's binary dilation
-
\a\b\c
示例运行 -
from scipy.ndimage import binary_dilation
out = binary_dilation(arr, structure=np.ones((3,3))).astype(int)
答案 1 :(得分:0)
您描述的操作称为"二进制扩张"。 scipy.ndimage
中有一个实现。例如,
In [369]: a
Out[369]:
array([[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, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0]])
In [370]: from scipy.ndimage import binary_dilation
In [371]: binary_dilation(a, structure=np.ones((3, 3)))
Out[371]:
array([[False, False, False, False, False, False],
[False, False, True, True, True, False],
[False, False, True, True, True, True],
[False, True, True, True, True, True],
[False, True, True, True, True, True],
[False, True, True, True, False, False]], dtype=bool)
In [372]: binary_dilation(a, structure=np.ones((3, 3))).astype(int)
Out[372]:
array([[0, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 1, 0],
[0, 0, 1, 1, 1, 1],
[0, 1, 1, 1, 1, 1],
[0, 1, 1, 1, 1, 1],
[0, 1, 1, 1, 0, 0]])