首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在NumPy中是否有ndarray的“边界框”函数(具有非零值的切片)?

在NumPy中是否有ndarray的“边界框”函数(具有非零值的切片)?
EN

Stack Overflow用户
提问于 2011-01-27 02:14:07
回答 3查看 8.4K关注 0票数 21

我正在处理通过numpy.array()创建的数组,并且需要在模拟图像的画布上绘制点。由于在包含有意义的数据的数组的中心部分有很多零值,我想“修剪”数组,擦除只包含零的列和只包含零的行。

因此,我想知道一些本机numpy函数,甚至是一个代码片段,以便“修剪”或找到一个“边界框”,以仅对数组中包含数据的部分进行切片。

(因为这是一个概念性的问题,所以我没有放任何代码,如果我应该这样做,很抱歉,我很新在这样的帖子上。)

感谢您的阅读

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-24 16:12:25

下面的代码,来自this answer,在我的测试中运行得最快:

代码语言:javascript
复制
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的非零区域)。

票数 14
EN

Stack Overflow用户

发布于 2011-01-27 03:29:00

这应该可以做到:

代码语言:javascript
复制
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]
票数 24
EN

Stack Overflow用户

发布于 2011-01-27 03:11:21

类似于:

代码语言:javascript
复制
empty_cols = sp.all(array == 0, axis=0)
empty_rows = sp.all(array == 0, axis=1)

得到的数组将是一维布尔数组。从它们的两端开始循环,找到“边界框”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4808221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档