是否可以使用numpy.nanargmin
,以便在只有nans的列上返回numpy.nan
。现在,当发生这种情况时,它会引发ValueError
。我不能使用numpy.argmin
,因为当列中只有少数nans时,这将失败。
http://docs.scipy.org/doc/numpy/reference/generated/numpy.nanargmin.html表示ValueError
是针对全纳切片而提出的。在这种情况下,我希望它返回numpy.nan(只是为了进一步掩盖"非数据"与nans)
下一步是这样做的,但是速度超慢,并不是真正的pythonic:
for i in range(R.shape[0]):
bestindex = numpy.nanargmin(R[i,:])
if(numpy.isnan(bestindex)):
bestepsilons[i]=numpy.nan
else:
bestepsilons[i]=epsilon[bestindex]
下一步也适用,但前提是不涉及全纳列:
ar = numpy.nanargmin(R, axis=1)
bestepsilons = epsilon[ar]
理想情况下,我希望最后一点也适用于全纳列
答案 0 :(得分:2)
>>> def _nanargmin(arr, axis):
... try:
... return np.nanargmin(arr, axis)
... except ValueError:
... return np.nan
演示:
>>> a = np.array([[np.nan]*10, np.ones(10)])
>>> _nanargmin(a, axis=1)
nan
>>> _nanargmin(a, axis=0)
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
无论如何,它不太可能是你想要的。不确定你究竟是在追求什么。如果您只想过滤掉nan
,那么请使用布尔索引:
>>> a[~np.isnan(a)]
array([ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
>>> np.argmin(_)
0
EDIT2:看起来像是在蒙面数组之后:
>>> a = np.vstack(([np.nan]*10, np.arange(10), np.arange(11, 1, -1)))
>>> a[2, 4] = np.nan
>>> m = np.ma.masked_array(a, np.isnan(a))
>>> np.argmin(m, axis=0)
array([1, 1, 1, 1, 1, 1, 2, 2, 2, 2])
>>> np.argmin(m, axis=1)
array([0, 0, 9])
答案 1 :(得分:0)
找到解决方案:
# makes everything nan to start with
bestepsilons1 = numpy.zeros(R.shape[0])+numpy.nan
# finds the indices where the entire column would be nan, so the nanargmin would raise an error
d0 = numpy.nanmin(R, axis=1)
# on the indices where we do not have a nan-column, get the right index with nanargmin, and than put the right value in those points
bestepsilons1[~numpy.isnan(d0)] = epsilon[numpy.nanargmin(R[~numpy.isnan(d0),:], axis=1)]
这基本上是一种解决方法,只需将nanargmin放在不会产生错误的地方,因为在那些地方我们希望得到的指数无论如何都是纳米