是否可以使用
numpy.nanargmin
,以便在其中只有 nan 的列上返回 numpy.nan
。现在,当这种情况发生时,它会引发 ValueError
。我不能使用 numpy.argmin
,因为当列中只有几个 nan 时,这会失败。
http://docs.scipy.org/doc/numpy/reference/ generated/numpy.nanargmin.html 表示
ValueError
是针对全 nan 切片而升高的。在这种情况下,我希望它返回 numpy.nan (只是为了进一步用 nan 掩盖“非数据”)
接下来的一点就是这样做的,但是速度超级慢并且不是真正的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]
所以理想情况下我希望最后一点也能与全纳米列一起使用
>>> 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])
找到解决方案:
# 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 ,因为在这些地方我们希望结果索引无论如何都是 nan
我对形状数组(nz,ny,nx)有类似的问题,其中一些 切片 [:,j,i] 完全充满 NaN。就我而言,我需要 argmax 沿轴索引=0 如果我这样做
np.nanargmax(array,axis=0)
我收到“ValueError:遇到 All-NaN 切片”
考虑到我对由所有 NaN 组成的切片的 argmax 不感兴趣,作为一种解决方法,我用零填充了 NaN
mask = np.isnan(array)
array[mask] = 0
idx2d = np.argmax(array,axis=0)
这给出了数组沿 axis=0 的 max 索引。 idx2d数组可以再次重新屏蔽
idx2d = np.ma.masked_where(mask[0],idx2d)
如果您寻找 np.argmin 您可以执行相同的步骤,但将数组设置为一个巨大的数字而不是 0。