是否有SciPy方法可以自动裁剪图像,即e。从2D numpy.ndarray修剪零?

时间:2019-05-29 09:51:52

标签: python numpy scipy crop trim

对于{d {1}},第1天有numpy.trim_zeros。我可以使用numpy.ndarraynumpy中的哪一种方法来修剪2d数组的零?

scipy

我想要得到的结果:

>>> import numpy as np
>>> a = np.array([[0, 0, 0, 0], [4, 1, 2, 0], [0, 3, 6, 0], [0, 0, 0, 0], [0, 0, 0, 0]])
>>> a
array([[0, 0, 0, 0],
       [4, 1, 2, 0],
       [0, 3, 6, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0]])

2 个答案:

答案 0 :(得分:2)

您可以尝试使用某些numpy方法进行列表理解:

>>> np.array([sub[~(sub == 0)].tolist() for sub in a if sub[sub != 0].tolist()])
array([[4, 1, 2], [3, 6]], dtype=object)
>>> 

答案 1 :(得分:1)

我将搜索最左,最右,最顶和最底非零的位置,然后按以下方式对该数组进行切片:

import numpy as np
a = np.array([[0, 0, 0, 0], [4, 1, 2, 0], [0, 3, 6, 0], [0, 0, 0, 0], [0, 0, 0, 0]])
nzero = np.nonzero(a)
top,bottom = np.min(nzero[0]),np.max(nzero[1])
left,right = np.min(nzero[1]),np.max(nzero[1])
out = a[top:bottom+1,left:right+1] # +1 as second argument is exclusive
print(out)

输出:

[[4 1 2]
 [0 3 6]]

请注意,通过添加nearestfarthest(分别是np.min的{​​{1}}和np.maxnzero[2]@csrf也可以很容易地将这种方法应用于3D阵列。