gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:54:16 26 4
gpt4 key购买 nike

我有一个形状为 (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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com