我正在处理通过numpy.array()创建的数组,并且需要在模拟图像的画布上绘制点。由于在包含有意义的数据的数组的中心部分有很多零值,我想“修剪”数组,擦除只包含零的列和只包含零的行。
因此,我想知道一些本机numpy函数,甚至是一个代码片段,以便“修剪”或找到一个“边界框”,以仅对数组中包含数据的部分进行切片。
(因为这是一个概念性的问题,所以我没有放任何代码,如果我应该这样做,很抱歉,我很新在这样的帖子上。)
感谢您的阅读
发布于 2017-06-24 16:12:25
下面的代码,来自this answer,在我的测试中运行得最快:
def bbox2(img):
rows = np.any(img, axis=1)
cols = np.any(img, axis=0)
ymin, ymax = np.where(rows)[0][[0, -1]]
xmin, xmax = np.where(cols)[0][[0, -1]]
return img[ymin:ymax+1, xmin:xmax+1]
使用argwhere
的公认答案有效,但运行速度较慢。我的猜测是,这是因为argwhere
分配了一个巨大的索引输出数组。我在一个大的2D数组上进行了测试(一个1024x1024的图像,大约有50x100的非零区域)。
发布于 2011-01-27 03:29:00
这应该可以做到:
from numpy import array, argwhere
A = array([[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0],
[0, 0, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0]])
B = argwhere(A)
(ystart, xstart), (ystop, xstop) = B.min(0), B.max(0) + 1
Atrim = A[ystart:ystop, xstart:xstop]
发布于 2011-01-27 03:11:21
类似于:
empty_cols = sp.all(array == 0, axis=0)
empty_rows = sp.all(array == 0, axis=1)
得到的数组将是一维布尔数组。从它们的两端开始循环,找到“边界框”。
https://stackoverflow.com/questions/4808221
复制相似问题