如果列全部为 nan,则 numpy.nanargmin 返回 nan

问题描述 投票:0回答:3

是否可以使用

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]

所以理想情况下我希望最后一点也能与全纳米列一起使用

python numpy nan
3个回答
4
投票
>>> 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])

3
投票

找到解决方案:

# 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


0
投票

我对形状数组(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。

© www.soinside.com 2019 - 2024. All rights reserved.