有没有一种方法可以用相同的元素“标记”一个numpy数组中的相邻元素?

有没有一种方法可以用相同的元素“标记”一个numpy数组中的相邻元素?

问题描述:

我使用python 2.7和我随机生成的OpenCV的地区,在年底这个样子的numpy的数组:有没有一种方法可以用相同的元素“标记”一个numpy数组中的相邻元素?

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 1 1 0 0 
    0 0 0 0 0 0 0 0 0 0 1 1 0 0 
    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 0 0 0 
    0 0 0 0 0 1 1 1 0 0 0 0 0 0 
    0 0 0 0 0 1 1 1 0 0 0 0 0 0 
    0 0 0 0 0 1 1 0 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 

我实际上更大的矩阵工作,最多可生成5个区域。 我想要做的是阅读产生的矩阵和“群”的区域生成类似如下的第二矩阵:

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 1 1 0 0 
    0 0 0 0 0 0 0 0 0 0 1 1 0 0 
    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 0 0 0 
    0 0 0 0 0 2 2 2 0 0 0 0 0 0 
    0 0 0 0 0 2 2 2 0 0 0 0 0 0 
    0 0 0 0 0 2 2 0 0 0 0 0 0 0 
    0 0 0 0 0 2 0 0 0 0 0 0 0 0 
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 

因此,如果在最后我有5点编号的矩阵。 我对Python很新,但不知何故,我认为这可能是一个简单快捷的方法。我希望有一个人可以帮助我。

+2

对不起,这不是一个免费的写作服务,你需要显示你的努力和代码。也就是说,我认为没有一种“简单”的方法可以解决这个问题(“简单”是完全主观的),但我建议你先看看深度优先搜索或广度优先搜索来确定你的群体1由1 ...这也可以使用图论来解决,确定图的连通组件。 – Julien

+0

@Julien Bernu我在这里可能是错的,但似乎他正在寻求一个方向而不是免费代码。即使您怀疑已经发明了(并且正确),您是否真的必须展示自己的努力重新发明轮子? – Headcrab

+0

@Headcrab是啊,这是一条很好的线......忽略这个事实,我不知道这个“轮子”已经存在了,人们可能会争辩说,无论做什么,你都必须表现出至少一点努力:试图发明轮子,或者如果有人已经发明了它,就要努力寻找。 – Julien

在SciPy的scipy.ndimage.label正是这么做的

您需要定义后者评估结构元素属于一个群体,例如:

structure = [[1,1,1],[1,1,1],[1,1,1]] 

,如果你想找到那些在附近的元素包括对角线,或

structure = [[0,1,0],[1,1,1],[0,1,0]] 

如果你只需要留下一个点/右/上/下的人。请注意该函数返回两个值,第一个是您请求的数组,第二个是找到的“标签”的数量。

您可能会发现scipy.ndimage.measurements中的其他一些功能在这方面很有用。