这是一个有趣的话题,因为它可能会导致代码中的意外结果。假设我有一个数组如下;
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,但并非所有情况都如此清晰。
我在开发网站上看到过这个问题,想知道为什么0.0
没有kwarg选项可以在需要时返回np.nan,而B,是否有一个返回True /的函数如果整个矩阵充满了纳米,那就错了吗?
答案 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