Skip to main content
 首页 » 编程设计

python之避免 NaN 值并在 python 中明智地添加两个矩阵元素

2025年05月04日13cloudgamer

我有两个 4D 矩阵,我想添加它们。这两个矩阵具有完全相同的维度和元素数量,但它们都包含随机分布的 NaN 值。

我更愿意使用 numpy.nansum 如下添加它们。
(1) 如果两个值相加我希望总和是一个值,
(2) 如果添加一个值和一个 NaN 我希望总和是值和
(3) 如果添加两个 NaN 我希望总和为 NaN。

这是我尝试过的

a[6x7x180x360] 
b[6x7x180x360] 
 
C=np.nansum[(a,b)] 
C=np.nansum(np.dstack((a,b)),2) 

但我无法获得与输入维度相同的结果矩阵。这意味着结果矩阵 C 应该在 [6x7x180x360] 中。 任何人都可以在这方面提供帮助。提前谢谢你。

请您参考如下方法:

你可以使用 np.stack((a,b))沿新的 0 轴堆叠,然后调用 nansum 沿该 0 轴求和:

C = np.nansum(np.stack((a,b)), axis=0) 

例如,

In [34]: a = np.random.choice([1,2,3,np.nan], size=(6,7,180,360)) 
 
In [35]: b = np.random.choice([1,2,3,np.nan], size=(6,7,180,360)) 
 
In [36]: np.stack((a,b)).shape 
Out[36]: (2, 6, 7, 180, 360) 
 
In [37]: np.nansum(np.stack((a,b)), axis=0).shape 
Out[37]: (6, 7, 180, 360) 

你的想法是对的,但是np.dstack沿着第三个轴堆叠,这在这里是不可取的,因为你已经有 4 个轴:

In [31]: np.dstack((a,b)).shape 
Out[31]: (6, 7, 360, 360) 

关于您的观点 (3): 请注意 np.nansum depends on the NumPy version 的行为:

In NumPy versions <= 1.8.0 Nan is returned for slices that are all-NaN or empty. In later versions zero is returned.

如果您使用的 NumPy 版本 > 1.8.0,那么您可能必须使用 solution such as Maarten Fabré's来解决这个问题。