NumPy中的ndarray是否有“边界框”功能(具有非零值的切片)?

时间:2011-01-26 18:14:07

标签: python arrays numpy trim bounding

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

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

(因为这是一个概念性的问题,我没有提供任何代码,对不起,如果我应该,我很新鲜在SO上发帖。)

感谢您阅读

3 个答案:

答案 0 :(得分:21)

这应该这样做:

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]

答案 1 :(得分:8)

以下代码来自this answer,在我的测试中跑得最快:

argwhere

使用argwhere接受的答案有效,但速度较慢。我的猜测是,因为 final Toast testing = Toast.makeText(context, "start.", Toast.LENGTH_SHORT); testing.show(); 分配了一个巨大的输出索引数组。我在大型2D阵列(1024 x 1024图像,大约50x100非零区域)上进行了测试。

答案 2 :(得分:0)

类似的东西:

empty_cols = sp.all(array == 0, axis=0)
empty_rows = sp.all(array == 0, axis=1)

生成的数组将是1D布尔数组。从两端循环它们以找到“边界框”。