假设我们有一个矩阵:
a = array([[ 2., 3., 0., 0., 0.],
[ 0., 4., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]])
找到最大非零矩阵(即不完全为零的矩阵)并跨越所有元素的最佳方法是什么,例如
[[2.,3.],
[0.,4.]]
我经历了numpy.nonzero,它给出了非零元素的索引,但是我如何有效地使用它来获得期望的矩阵?
矩阵必须为正方形。我现在已经提出了,
a[:np.nonzero(a)[0][-1]+1,:np.nonzero(a)[1][-1]+1]
有效。但似乎并不优雅。如果矩阵不是从0开始,它也将不起作用。
[[0,0,2,3,0],
[0,0,0,4,0],
[0,0,0,0,0],
[0,0,0,0,0],
[0,0,0,0,0]]
这里的预期输出是
[[2,3],
[0,4]]
答案 0 :(得分:0)
它在第二种情况下不起作用的原因是,由于始终指定结束范围,因此形成矩阵的起点始终为0,0
。
这将在两个轴上将np.nonzero
的最小索引作为起始范围,将np.nonzero
的最大索引作为终止范围。因此,保证包含所有非零元素
a[np.min(np.nonzero(a)[0]):np.max(np.nonzero(a)[0])+1,
np.min(np.nonzero(a)[1]):np.max(np.nonzero(a)[1])+1]