python - bool 二维数组的子区域

标签 python python-3.x numpy numpy-ndarray

假设我有一个二维 bool 数组。我想获得切片/或类似切片的列表,其中每个切片代表包含 True 值的数组的最小(大小)子区域,而其边界包含所有 False。

我可以循环每行和每列并在满足此类条件时存储索引,但我想知道您是否知道另一种方法或库可以有效地执行此操作?您可以假设原始 bool 数组的边界始终为 False/0。

示例 1

enter image description here

示例 2

enter image description here

编辑 !添加了具有正确解决方案的新示例。对困惑感到抱歉。

最佳答案

那是连通分量分析,这是asked and answered before .根据您的需要调整接受的答案,可能的解决方案很短:

import numpy as np
from scipy.ndimage.measurements import label


def analysis(array):
    labeled, _ = label(array, np.ones((3, 3), dtype=np.int))
    for i in np.arange(1, np.max(labeled)+1):
        pixels = np.array(np.where(labeled == i))
        x1 = np.min(pixels[1, :])
        x2 = np.max(pixels[1, :])
        y1 = np.min(pixels[0, :])
        y2 = np.max(pixels[0, :])
        print(str(i) + ' | slice: array[' + str(y1) + ':' + str(y2) + ', ' + str(x1) + ':' + str(x2) + ']')


example1 = np.array([
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
    [0, 0, 0, 1, 0, 1, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 1, 1, 0],
    [0, 0, 0, 0, 0, 0, 1, 1, 0, 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]
]).astype(bool)

example2 = np.array([
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 1, 0, 1, 0, 0],
    [0, 0, 0, 1, 0, 0, 1, 0, 1, 0],
    [0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
    [0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 1, 0, 0, 1, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 1, 1, 0, 0, 1, 0],
    [0, 0, 0, 0, 1, 0, 1, 0, 0, 0],
    [0, 0, 0, 1, 0, 0, 0, 0, 1, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
]).astype(bool)

for a in [example1, example2]:
    print(a, '\n')
    analysis(a)
    print('\n')

这是输出(没有示例):

[[...]] 

1 | slice: array[1:2, 3:5]
2 | slice: array[4:6, 6:8]
3 | slice: array[8:8, 2:2]

[[...]] 

1 | slice: array[1:3, 5:8]
2 | slice: array[2:2, 3:3]
3 | slice: array[4:5, 1:1]
4 | slice: array[5:8, 3:6]
5 | slice: array[6:6, 8:8]
6 | slice: array[8:8, 8:8]

希望有帮助!

------------------
System information
------------------
Python:  3.8.1
SciPy:   1.4.1
------------------

关于python - bool 二维数组的子区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59680258/

相关文章:

python - 如何根据条件过滤 pandas 系列值

python - 如何查找字符串中某个字符所有出现的索引?

python - 如何在 TensorFlow 数字识别中使用自己的手绘图像

Python 跳过/删除不可解码的字符

Python Numpy 数组附加空白列

python - 如何将 pandas 中的 log2 比例转换为正常比例

python - django:360度全景照片

Python:将列标题转换为单列值

python - 逐行读取文本文件并检查其中 2 行的子字符串

python-3.x - Scrapy 日志记录级别更改