Numpy数组值"污染"

时间:2016-06-13 13:47:54

标签: python arrays numpy python-3.5

我有一个填充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

但这似乎有些过分(特别是因为我打算处理非常大的数组)。

有没有办法实现这一点而无需遍历所有值?

2 个答案:

答案 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]])