基于numpy数组的Python轮廓图

0 投票
1 回答
1489 浏览
提问于 2025-04-17 13:33

我有一个由零和一组成的二维 numpy 数组,这个数组用作其他数组的遮罩。我想用 matplotlib.contour 来在图上突出显示一个区域,但每次尝试时都会出现一个错误,提示 zero-size array to minimum.reduce without identity。有人知道怎么解决吗?

因为这个遮罩是一些矩形的组合,我尝试手动找到这些矩形的边缘,但效果不太好。以下是我使用的代码:

tmp1,tmp2 = [],[]
for ii in range(len(mask))[1:-2]:
    if mask[ii+1] - mask[ii] != 1: tmp1.append(mask[ii])
if mask[ii] - mask[ii-1] != 1: tmp2.append(mask[ii]-1)


rect_limits = []
for ii in range(len(tmp1)):
    rect_limits.append([- delta_cont, tmp1[ii], delta_cont, tmp2[ii]])

这样的话,tmp1tmp2 应该能给我我想找的矩形的最大值和最小值。(矩形的侧边是固定的,所以这部分没有问题)。

然后我只需要用 add_patch 来创建我想要的矩形轮廓。

有没有其他方法可以找到矩形的边缘呢?

编辑:

好的,我的遮罩大概是这样的:

[[0 0 0 0 0 0 0 0 0 0 0 0],
[0 0 0 0 0 0 1 1 1 1 0 0],      
[0 0 0 0 0 0 1 1 1 1 0 0],
[0 0 0 0 0 0 1 1 1 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 1 1 1 1 0 0],
[0 0 0 0 0 0 1 1 1 1 0 0],
[0 0 0 0 0 0 1 1 1 1 0 0],
[0 0 0 0 0 0 1 1 1 1 0 0]]

理想情况下,我希望得到的结果是:

[[1,3],[6,9]]

也就是说,构建一个这样的数组:

[[y_start1,y_end1],[y_start2,y_end2],...]

1 个回答

0

这是一个名为 answer.py 的文件。

mygrid = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
          [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0],
          [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0],
          [0, 0, 0, 0, 0, 0, 1, 1, 1, 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, 1, 1, 1, 1, 0, 0],
          [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0],
          [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0],
          [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0]]

def findEdges(grid)
    y_start = -1
    saved = []
    for lineno, row in enumerate(grid):
        # Case where we don't have a start point
        if y_start == -1 and 1 in row:
            y_start = lineno
        # Case where we have a start point and we just hit a zero row
        if y_start != -1 and 1 not in row:           
            saved.append((y_start, lineno-1))
            y_start = -1
        # Case where we have a start point and hit the end of the table
        if lineno == len(grid)-1 and y_start > 0:
            saved.append((y_start, lineno))

    return saved

print(findEdges(mygrid))

运行后会得到这样的结果:

mike@example ~ $ python answer.py
[(1, 3), (6, 9)]

注意:如果允许两个或更多的矩形并排放在网格上,这个方法就不管用了。

撰写回答