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

标签 python numpy

我有两个 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来解决这个问题。

关于python - 避免 NaN 值并在 python 中明智地添加两个矩阵元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50642414/

相关文章:

python - Python 3.5 在字典中进行比较时选择键的选择

python - Django 1.6 和 Celery 3.0 内存泄漏

python - 递归:带有 `scipy.lfilter` 的 IIR 滤波器

python - 拆分列中的名称

python - 将 C++ 数组传递给 python

python - 在 Python 中实现 MATLAB 的 im2col 'sliding'

用特定索引中的 numpy 数组的其他值替换特定值的 Pythonic 方法

python - 如何设置 cherrypy 服务器发送的事件

python - SciPy 无法将复数转换为 float

python - 允许 Outlook 2007 编辑自定义共享 iCalendar