在二维numpy数组的每一行中找到最小非零值

时间:2020-08-01 20:29:27

标签: python arrays numpy

我正在尝试在2d numpy数组的每一行中找到最小的非零值,但是还没有找到一种优雅的解决方案。我看了其他一些帖子,但没有一个解决完全相同的问题,例如 Minimum value in 2d arrayMin/Max excluding zeros but in 1d array
例如对于给定的数组:

x = np.array([[3., 2., 0., 1., 6.], [8., 4., 5., 0., 6.], [0., 7., 2., 5., 0.]])

答案将是:

[1., 4., 2.]

4 个答案:

答案 0 :(得分:2)

一种方法是将零重新分配给np.inf,然后每行取最小值:

np.where(x>0, x, np.inf).min(axis=1)

输出:

array([1., 4., 2.])

答案 1 :(得分:2)

屏蔽数组是专门为这些目的而设计的。您可以利用数组中的遮罩零(或您想要的任何其他种类的遮罩),现在就对遮罩数组中的常规数组执行几乎所有的工作:

import numpy.ma as ma
mx = ma.masked_array(x, mask=x==0)
mx.min(1)

输出:

[1.0 4.0 2.0]

答案 2 :(得分:1)

# example data
x = np.array([[3., 2., 0., 1., 6.], [8., 4., 5., 0., 6.], [0., 7., 2., 5., 0.]])

# set all the values inside the maxtrix which are equal to 0, to *inf*
# np.inf represents a very large number
# inf, stands for infinity
x[x==0] = np.inf

# grep the lowest value, in each array (now that there is no 0 value anymore)
np.min(x, axis=1)

答案 3 :(得分:1)

我以这种方式解决了,时间复杂度为o(n^2)

import numpy as np
x = np.array([[3., 2., 0., 1., 6.], [8., 4., 5., 0., 6.], [0., 7., 2., 5., 0.]])

for i in range(len(x)) :
    small=x[i][i]
    for j in x[i] :
        if (j!=0 and j<small):
            small=j
    print(small)