我正在处理通过numpy.array()创建的数组,我需要在模拟图像的画布上绘制点。由于包含有意义数据的数组中心部分周围有很多零值,我想“修剪”数组,删除仅包含零的行和仅包含零的行。
所以,我想知道一些本地numpy函数甚至是一个代码片段来“修剪”或找到一个“边界框”来仅切片数组中包含数据的部分。
(因为这是一个概念性的问题,我没有提供任何代码,对不起,如果我应该,我很新鲜在SO上发帖。)
感谢您阅读
答案 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布尔数组。从两端循环它们以找到“边界框”。