python - 如果 numpy 中的轴中存在任何 nan,则将 nan 设置为整个轴

标签 python numpy

我有一个形状为 (x,y,R) 的 3 维 numpy 数组。对于每个 (x,y) 对,我都有一个 R 值的一维 numpy 数组。如果任何 R 值是 nanzero,我想将整个数组设置为 nan。我试过类似的东西

# 3d np array is called: data
mask1 = (data==0).any(axis=2)
mask2 = (data==np.nan).any(axis=2)
data[np.logical_or(mask1, mask2)] = np.nan

但这似乎行不通,我认为问题在于我尝试将 numpy arraylower dimensional bool 区域进行子集化的方式,但不是非常确定如何解决这个问题。

一些示例数据:

y = np.random.random(size=(2,2,3))
y[0,0,2] = np.nan
y[0,1,0] = np.nan
y[0,0,1] = np.nan
y[1,1,2] = 0.

这样:

y[0,0,:]
array([0.092718,      nan,      nan])

y[0,1,:]
array([       nan, 0.00243745,        nan])

y[1,0,:]
array([0.5282173 , 0.7548559 , 0.08869139])

y[1,1,:]
array([0.19612415, 0.16969036, 0.0])

和期望的结果:

y[0,0,:]
array([nan, nan, nan])

y[0,1,:]
array([nan, nan, nan])

y[1,0,:]
array([0.5282173 , 0.7548559 , 0.08869139])

y[1,1,:]
array([nan, nan, nan])

更新

这似乎可行,但也许还有更优雅的方法:

mask1 = (y==0).any(axis=2)

y[np.logical_or(np.sum(np.isnan(y), axis=2) > 0, mask1)] = np.nan

    y
    array([[[       nan,        nan,        nan],
            [       nan,        nan,        nan]],

           [[0.5282173 , 0.7548559 , 0.08869139],
            [       nan,        nan,        nan]]])

最佳答案

nan 具有比较不等于任何东西的特殊属性,包括 nan 本身:

>>> y = np.random.random(size=(2,2,3))
>>> y[0,0,2] = np.nan
>>> y[0,1,0] = np.nan
>>> y[0,0,1] = np.nan
>>> y[0,1,2] = np.nan
>>> 
>>> y
array([[[0.03161193,        nan,        nan],
        [       nan, 0.55789282,        nan]],

       [[0.78047397, 0.06949872, 0.65225197],
        [0.84801579, 0.11298244, 0.07627531]]])
>>> 
>>> y == np.nan
array([[[False, False, False],
        [False, False, False]],

       [[False, False, False],
        [False, False, False]]])

要检查 nan,您必须使用 np.isnan

>>> np.isnan(y)
array([[[False,  True,  True],
        [ True, False,  True]],

       [[False, False, False],
        [False, False, False]]])

通过这个小小的修改,您的代码将真正起作用:

>>> mask1 = (y==0).any(axis=2)
>>> mask2 = np.isnan(y).any(axis=2)
>>> y[np.logical_or(mask1, mask2)] = np.nan
>>> 
>>> y
array([[[       nan,        nan,        nan],
        [       nan,        nan,        nan]],

       [[0.78047397, 0.06949872, 0.65225197],
        [0.84801579, 0.11298244, 0.07627531]]])

关于python - 如果 numpy 中的轴中存在任何 nan,则将 nan 设置为整个轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49002272/

相关文章:

python - 如何更改在循环中初始化的 Tkinter 按钮的文本

python - 无法在 macOS 上安装 pybind

python - 将不同维度的数组 append 到单个数组

python - 根据 bool 数组查找连续序列

Python,按数据集的梯度分割数组

python - 使用 saltstack python api 获取和设置支柱值

python - scipy.curve_fit 与 numpy.polyfit 不同的协方差矩阵

python - 使用批量提交系统时调试潜在的整数溢出?

python - SKLearn值错误: setting an array element with a sequence

python - 将 setuptools 与安装后和 python 依赖项一起使用