Python 是否有一种SciPy方法可以自动拍摄图像,即。E从2d“numpy.ndarray”修剪零?

Python 是否有一种SciPy方法可以自动拍摄图像,即。E从2d“numpy.ndarray”修剪零?,python,numpy,scipy,crop,trim,Python,Numpy,Scipy,Crop,Trim,对于1dnumpy.ndarray。可以使用numpy或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

对于1d
numpy.ndarray
。可以使用
numpy
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]])
我希望得到的结果是:

array([[4, 1, 2],
       [0, 3, 6]])

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

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

我将搜索最左边、最右边、最上面和最下面的非零的位置,然后按照以下方式切片该数组:

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]]

请注意,通过添加
最近的
最远的
,这种方法也可以很容易地应用于3D阵列,它们分别是
nzero[2]

np.min和
np.max
,如果第二列都是零呢?
a=np.transpose(a[np.sum(a,1)==0])
两次