Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 洪水填充NumPy数组`NumPy.ndarray`,i。E为元素指定新值,并更改具有相同值的相邻元素_Python_Arrays_Numpy_Scipy_Flood Fill - Fatal编程技术网

Python 洪水填充NumPy数组`NumPy.ndarray`,i。E为元素指定新值,并更改具有相同值的相邻元素

Python 洪水填充NumPy数组`NumPy.ndarray`,i。E为元素指定新值,并更改具有相同值的相邻元素,python,arrays,numpy,scipy,flood-fill,Python,Arrays,Numpy,Scipy,Flood Fill,另一个类似的帖子是关于洪水填充的非常一般的问题,答案只包含一个广泛的伪代码示例。我正在寻找使用numpy或scipy的显式解决方案 以这个数组为例: a = np.array([ [0, 1, 1, 1, 1, 0], [0, 0, 1, 2, 1, 1], [0, 1, 1, 1, 1, 0] ]) 对于选择元素0、0和使用值3填充洪水,我希望: [ [3, 1, 1, 1, 1, 0], [3, 3, 1, 2, 1, 1], [3, 1,

另一个类似的帖子是关于洪水填充的非常一般的问题,答案只包含一个广泛的伪代码示例。我正在寻找使用
numpy
scipy
的显式解决方案


以这个数组为例:

a = np.array([
    [0, 1, 1, 1, 1, 0],
    [0, 0, 1, 2, 1, 1],
    [0, 1, 1, 1, 1, 0]
])
对于选择元素
0、0
和使用值
3
填充洪水,我希望:

[
    [3, 1, 1, 1, 1, 0],
    [3, 3, 1, 2, 1, 1],
    [3, 1, 1, 1, 1, 0]
]
[
    [0, 3, 3, 3, 3, 0],
    [0, 0, 3, 2, 3, 3],
    [0, 3, 3, 3, 3, 0]
]
[
    [0, 1, 1, 1, 1, 3],
    [0, 0, 1, 2, 1, 1],
    [0, 1, 1, 1, 1, 0]
]
对于选择元素
0、1
和使用值
3
填充洪水,我希望:

[
    [3, 1, 1, 1, 1, 0],
    [3, 3, 1, 2, 1, 1],
    [3, 1, 1, 1, 1, 0]
]
[
    [0, 3, 3, 3, 3, 0],
    [0, 0, 3, 2, 3, 3],
    [0, 3, 3, 3, 3, 0]
]
[
    [0, 1, 1, 1, 1, 3],
    [0, 0, 1, 2, 1, 1],
    [0, 1, 1, 1, 1, 0]
]
对于选择元素
0、5
和使用值
3
填充洪水,我希望:

[
    [3, 1, 1, 1, 1, 0],
    [3, 3, 1, 2, 1, 1],
    [3, 1, 1, 1, 1, 0]
]
[
    [0, 3, 3, 3, 3, 0],
    [0, 0, 3, 2, 3, 3],
    [0, 3, 3, 3, 3, 0]
]
[
    [0, 1, 1, 1, 1, 3],
    [0, 0, 1, 2, 1, 1],
    [0, 1, 1, 1, 1, 0]
]
这应该是一个相当基本的操作,不是吗?我忽略了哪种
numpy
scipy
方法?

方法#1

模块
scikit图像
提供了内置功能,可对-

样本运行-

In [17]: a
Out[17]: 
array([[0, 1, 1, 1, 1, 0],
       [0, 0, 1, 2, 1, 1],
       [0, 1, 1, 1, 1, 0]])

In [18]: flood_fill(a, (0, 0), 3)
Out[18]: 
array([[3, 1, 1, 1, 1, 0],
       [3, 3, 1, 2, 1, 1],
       [3, 1, 1, 1, 1, 0]])

In [19]: flood_fill(a, (0, 1), 3)
Out[19]: 
array([[0, 3, 3, 3, 3, 0],
       [0, 0, 3, 2, 3, 3],
       [0, 3, 3, 3, 3, 0]])

In [20]: flood_fill(a, (0, 5), 3)
Out[20]: 
array([[0, 1, 1, 1, 1, 3],
       [0, 0, 1, 2, 1, 1],
       [0, 1, 1, 1, 1, 0]])
方法#2

我们可以使用一些
阵列屏蔽
-

from skimage.measure import label

def floodfill_by_xy(a,xy,newval):
    x,y = xy
    l = label(a==a[x,y])
    a[l==l[x,y]] = newval
    return a
要使用基于SciPy的
标签
函数-,基本上是相同的-

from scipy.ndimage.measurements import label

def floodfill_by_xy_scipy(a,xy,newval):
    x,y = xy
    l = label(a==a[x,y])[0]
    a[l==l[x,y]] = newval
    return a

注意:这些将作为现场编辑工作。

可能重复@Goyo,这是一个伪代码,如果不对接受的解决方案进行有益的更改,则无法使用数组。您打算如何使用此处接受的解决方案来解决此问题?请注意,它是
(y,x)
而不是
(x,y)