我有以下格式的数据集:
[[ 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
)或max
。 max
因列而异。感谢您的帮助!
# 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
答案 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