【问题标题】:Adding two 2D NumPy arrays ignoring NaNs in them添加两个 2D NumPy 数组,忽略其中的 NaN
【发布时间】:2016-01-21 01:03:10
【问题描述】:

以 numpy.nan 作为缺失值添加 2 个 numpy 数组 a 和 b(均为 2D)的正确方法是什么?

  1. a + b

  1. numpy.ma.sum(a,b)

【问题讨论】:

  • 加法中的“缺失值”是什么意思?
  • 感谢@Divakar,应该忽略缺失值。如果一个数组有缺失值而另一个没有,不确定 numpy 会做什么。
  • @user308827 你试过了吗?
  • 我有,a + b 似乎在一种情况下有效。然而,在另一种情况下,它最终的所有值都是 nan
  • 请提供示例输入和预期输出。不清楚你在问什么。

标签: python arrays numpy nan


【解决方案1】:

只需将两个数组中的 NaNs 替换为零即可:

a[np.isnan(a)] = 0  # replace all nan in a with 0
b[np.isnan(b)] = 0  # replace all nan in b with 0

然后进行加法:

a + b

这取决于0 是用于加法的"identity element" 这一事实。

【讨论】:

    【解决方案2】:

    由于输入是二维数组,您可以使用np.dstack 将它们沿第三轴堆叠,然后使用np.nansum,这将确保忽略NaNs,除非两个输入数组中都有NaNs,其中案例输出也将有NaN。因此,实现看起来像这样 -

    np.nansum(np.dstack((A,B)),2)
    

    示例运行 -

    In [157]: A
    Out[157]: 
    array([[ 0.77552455,  0.89241629,         nan,  0.61187474],
           [ 0.62777982,  0.80245533,         nan,  0.66320306],
           [ 0.41578442,  0.26144272,  0.90260667,         nan],
           [ 0.65122428,  0.3211213 ,  0.81634856,         nan],
           [ 0.52957704,  0.73460363,  0.16484994,  0.20701344]])
    
    In [158]: B
    Out[158]: 
    array([[ 0.55809925,  0.1339353 ,         nan,  0.35154039],
           [ 0.94484722,  0.23814073,  0.36048809,  0.20412318],
           [ 0.25191484,         nan,  0.43721322,  0.95810905],
           [ 0.69115038,  0.51490958,         nan,  0.44613473],
           [ 0.01709308,  0.81771896,  0.3229837 ,  0.64013882]])
    
    In [159]: np.nansum(np.dstack((A,B)),2)
    Out[159]: 
    array([[ 1.3336238 ,  1.02635159,         nan,  0.96341512],
           [ 1.57262704,  1.04059606,  0.36048809,  0.86732624],
           [ 0.66769925,  0.26144272,  1.33981989,  0.95810905],
           [ 1.34237466,  0.83603089,  0.81634856,  0.44613473],
           [ 0.54667013,  1.55232259,  0.48783363,  0.84715226]])
    

    【讨论】:

    • 当两个输入都是NaN 时返回NaN 的行为已更改为NumPy 版本> 1.9.0。在较新的版本中,返回零!
    猜你喜欢
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 2015-11-26
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    相关资源
    最近更新 更多