添加两个2D NumPy数组,忽略其中的NaN

use*_*827 -1 python arrays numpy nan

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

  1. a + b

要么

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

Div*_*kar 9

由于输入是2D数组,你可以沿着第三轴堆叠它们np.dstack然后使用np.nansum,这将确保NaNs被忽略,除非NaNs两个输入数组都存在,在这种情况下输出也会有NaN.因此,实现看起来像这样 -

np.nansum(np.dstack((A,B)),2)
Run Code Online (Sandbox Code Playgroud)

样品运行 -

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]])
Run Code Online (Sandbox Code Playgroud)

  • 当NumPy版本大于1.9.0时,两个输入均为NaN时,返回NaN的行为。在较新的版本中,返回零! (2认同)

MSe*_*ert 6

只需将NaN两个数组中的s替换为零:

a[np.isnan(a)] = 0  # replace all nan in a with 0
b[np.isnan(b)] = 0  # replace all nan in b with 0
Run Code Online (Sandbox Code Playgroud)

然后执行加法:

a + b
Run Code Online (Sandbox Code Playgroud)

这依赖于作为加法0“身份元素”这一事实。