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

时间:2018-01-23 15:42:04

标签: python arrays numpy math nan

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

CREATE PROCEDURE dbo.MyProc
(
  @ColNm VARCHAR(20)
)
AS
BEGIN
  DECLARE @Qry VARCHAR(MAX)

  SELECT
      @Qry = 'SELECT '+@ColNm+' = Col_Name FROM YourTable'

   EXEC(@Qry)

END

import numpy as np X = np.array([np.nan,np.nan,np.nan,np.nan,np.nan]) 正确地返回平均切片为空并返回nan的警告。但是,在对数组np.nanmean(X)进行求和时,它会返回np.nansum(X)。现在虽然数学上是真的(没有任何东西的总和是0),但预期返回的结果可能是np.nan。

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

enter image description here

我在开发网站上看到过这个问题,想知道为什么0.0没有kwarg选项可以在需要时返回np.nan,而B,是否有一个返回True /的函数如果整个矩阵充满了纳米,那就错了吗?

2 个答案:

答案 0 :(得分:3)

Docs

  

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

解决方法:

def results = com.jayway.jsonpath.JsonPath.parse(prev.getResponseDataAsString()).read('YOUR_JSONPATH_HERE')
def builder = new StringBuilder()
results.eachWithIndex{ entry, idx ->
    builder.append('"').append(entry).append('"')
    if (idx < results.size() -1) {
        builder.append(',')
    }
}

vars.put('YOUR_VARIABLE_HERE', builder.toString())

您可以将kwargs传递给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

np.nansum()

答案 1 :(得分:0)

改进 Brad Solomon 的解决方法。将 **kwargs 传递给 all() 允许部分 nan 标记。

def nansumwrapper(a, **kwargs):
    mx = np.isnan(a).all(**kwargs)
    res = np.nansum(a, **kwargs)
    res[mx] = np.nan
    return res