python - 确定numpy数组中的相邻区域

标签 python arrays numpy region neighbours

我正在寻找以下内容。我有一个标记为区域的 numpy 数组。 numpy 数组表示分割图像。区域是具有相同值的许多相邻单元格。每个地区都有其独特的值(value)。具有 3 个区域的简化版本如下所示:

x = np.array([[1, 1, 1], [1, 1, 2], [2, 2, 2], [3, 3, 3]], np.int32)

输出:

array([[1, 1, 1],
       [1, 1, 2],
       [2, 2, 2],
       [3, 3, 3]])

在上面的示例中,我们有 3 个独立的区域,每个区域都标有唯一值(在本例中为 1、2、3)。

我想要的是每个单独区域的相邻(相邻)区域的值。所以在这种情况下:

  • 区域 1 与区域 2 相邻
  • 区域 2 与区域 1 和 3 相邻
  • 区域 3 与区域 2 相邻

实现此目标的最优雅、最快速的方法是什么?

非常感谢!

最佳答案

我知道任务是返回数组中与给定数字(例如 2)相邻的所有不同条目。使用 NumPy 方法实现此目的的一种方法是使用 roll将给定区域向上、向下、向左和向右移动一个单位。对移位的区域进行逻辑或运算,并返回所有匹配此条件的不同元素。然后它仍然删除该区域本身,因为它不被认为是它自己的邻居。

由于 roll 在相对端重新引入了超出数组边界的值(此处不希望这样做),因此额外的步骤是将此行或列替换为 False。

import numpy as np

x = np.array([[1, 1, 1], [1, 1, 2], [2, 2, 2], [3, 3, 3]], np.int32)
region = 2   # number of region whose neighbors we want

y = x == region  # convert to Boolean

rolled = np.roll(y, 1, axis=0)          # shift down
rolled[0, :] = False             
z = np.logical_or(y, rolled)

rolled = np.roll(y, -1, axis=0)         # shift up 
rolled[-1, :] = False
z = np.logical_or(z, rolled)

rolled = np.roll(y, 1, axis=1)          # shift right
rolled[:, 0] = False
z = np.logical_or(z, rolled)

rolled = np.roll(y, -1, axis=1)         # shift left
rolled[:, -1] = False
z = np.logical_or(z, rolled)

neighbors = set(np.unique(np.extract(z, x))) - set([region])
print(neighbors)

关于python - 确定numpy数组中的相邻区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38073433/

相关文章:

python - python线程和进程之间的管道有不同的行为吗?

java - 如何调整此代码以输入和打印数字列表?

java - 逐列添加数字的格式问题 [Java]

来自 JSON 数组的 mySQL WHERE IN

python - 按颜色计算加载到 numpy 数组中的图像的像素数

python - 如何解析时间表达式(尤其是时间范围),Python?

python - Tkinter Text Widget Ctrl+A + DEL 删除标签

python - 混合 pandas、datetime 和 numpy timedelta 时出现不稳定行为(bug?)

python - 如何在 python numpy 中并行化求和计算?

python - 在python中对名称列表进行排序