如何根据列范围将numpy数组中的0值替换为其他值?

时间:2019-05-27 11:59:21

标签: python numpy

我有以下格式的数据集:

[[ 226 600 3.33 915. 92.6 98.6 ] [ 217 700 3.34 640. 93.7 98.5 ] [ 213 900 3.35 662. 88.8 96. ] ... [ 108 600 2.31 291. 64. 70.4 ] [ 125 800 3.36 1094. 65.5 84.1 ] [ 109 400 2.44 941. 52.3 68.7 ]]

每个列都是一个单独的条件,具有自己的值范围。如何根据其列范围将0的值估算为大于零的值?换句话说,最差的最小值不是0。

我已经编写了以下代码,但是它只能将0更改为列中的最小值(当然是0)或maxmax因列而异。感谢您的帮助!

# Impute 0 values -- give them the worst value for that column

I, J = np.nonzero(scores == 0)
scores[I,J] = scores.min(axis=0)[J] # can only do min or max

2 个答案:

答案 0 :(得分:1)

一种方法是使用masked array来沿着掩盖<=0的列查找最小值。并使用np.where将数组中的0s替换为相应的最小值:

min_gt0 = np.ma.array(r, mask=r<=0).min(0)
np.where(r == 0, min_gt0, r)

这是一个例子:

r = np.random.randint(0,5,(5,5))

print(r)
array([[2, 1, 3, 0, 4],
       [0, 4, 4, 2, 2],
       [4, 0, 0, 0, 1],
       [1, 2, 2, 2, 2],
       [2, 0, 4, 4, 2]])

min_gt0 = np.ma.array(r, mask=r<=0).min(0)
np.where(r == 0, min_gt0, r)

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

答案 1 :(得分:1)

我认为您需要的是numpy.ma.masked_equal函数。

考虑一个数组:

a = np.array([4, 3, 8, 0, 5])
m = np.ma.masked_equal(a, 0) # mask = [0, 0, 0, 1, 0]

现在您可以调用m.min(),该值是该列中的第二个最小值。

m.min() # 3