基于numpy数组的Python轮廓图
我有一个由零和一组成的二维 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]])
这样的话,tmp1
和 tmp2
应该能给我我想找的矩形的最大值和最小值。(矩形的侧边是固定的,所以这部分没有问题)。
然后我只需要用 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)]
注意:如果允许两个或更多的矩形并排放在网格上,这个方法就不管用了。