对充满 nan 的 numpy 数组求和时出现意外的 nan 行为

J W*_*J W -1 python arrays math numpy nan

这是一个有趣的话题,因为它可能会导致代码中出现意外结果。假设我有一个如下数组;

import numpy as np

X = np.array([np.nan,np.nan,np.nan,np.nan,np.nan])
Run Code Online (Sandbox Code Playgroud)

np.nanmean(X)正确返回平均切片为空的警告并返回 nan。但是,在对数组求和时np.nansum(X),返回0.0。现在虽然数学上正确(无之和为 0),但预期返回的结果可能是 np.nan。

例如,我有一个函数,如果不存在冰数据文件,它将创建一个空的 nan 数组(180x360 点,每个点代表一个纬度/经度)。然后将此数组传递给一个函数,该函数对数组求和以找出数组中的冰总量。如果预期值为 9-1000 万平方公里,而 nansum 返回 0,这可能会产生误导。如果冰范围无论如何都在 0 左右,这将特别困难。在下图中,这显然是导致冰总和为 0.0 的缺失数据文件,但并非所有情况都如此清晰。

在此处输入图片说明

我在开发网站上看到了这个讨论,想知道为什么没有 kwarg 选项可以在np.nansum()需要时返回 np.nan,并且 B,如果整个矩阵充满了,是否有一个函数返回 True/False楠?

Bra*_*mon 5

文档

在 NumPy 版本 <= 1.8.0 中,对于全为 NaN 或空的切片,返回 Nan。在以后的版本中返回零。

解决方法:

def nansumwrapper(a, **kwargs):
    if np.isnan(a).all():
        return np.nan
    else:
        return np.nansum(a, **kwargs)

a = np.array([np.nan, np.nan])
b = np.array([np.nan, 1., 2.])


nansumwrapper(a)
# nan

nansumwrapper(b)
# 3.0
Run Code Online (Sandbox Code Playgroud)

您可以将 kwargs 传递给np.nansum()

c = np.arange(12, dtype=np.float_).reshape(4,3)
c[2:4, 1] = np.nan

nansumwrapper(c, axis=1)
# array([  3.,  12.,  14.,  20.])
Run Code Online (Sandbox Code Playgroud)