我有一个关于添加numpy数组的问题。 我们假设我已经定义了一个函数
def foo(a,b):
return a+b
采用两个相同形状的数组,只返回它们的总和。 现在,我必须处理一些条目可能是None的情况。 我想处理这些条目,因为它们对应于float(0),例如
[1.0,None,2.0] + [1.0,2.0,2.0]
将加起来
[2.0,2.0,4.0]
您能为我提供已经实施的解决方案吗?
TIA
答案 0 :(得分:3)
我建议numpy.nan_to_num
:
>>> np.nan_to_num(np.array([1.0,None,2.0], dtype=np.float))
array([ 1., 0., 2.])
然后,
>>> def foo(a,b):
... return np.nan_to_num(a) + np.nan_to_num(b)
...
>>> foo(np.array([1.0,None,2.0], dtype=np.float), np.array([1.0,2.0,2.0], dtype=np.float))
array([ 2., 0., 4.])
答案 1 :(得分:2)
您可以使用column_stack
沿第二个轴连接两个数组,然后使用np.nansum()
对第二个轴上的项目进行求和。
In [15]: a = np.array([1.0,None,2.0], dtype=np.float)
# Using dtype here is necessary to convert None to np.nan
In [16]: b = np.array([1.0,2.0,2.0])
In [17]: np.nansum(np.column_stack((a, b)), 1)
Out[17]: array([2., 2., 4.])
答案 2 :(得分:2)
通常,答案是使用浮点数组而不是任意对象数组,然后使用np.nan
代替None
。 NaN具有明确定义的算术语义。 (此外,使用浮点数组而不是对象将使您的代码更加节省时间和空间。)
请注意,如果您使用None
np.nan
或dtype
的明确float
构建数组,则无需手动将np.float64
转换为>>> a = np.array([1.0,np.nan,2.0])
>>> a = np.array([1.0,None,2.0],dtype=float)
。这两者都是等价的:
None
这意味着,如果出于某种原因,你确实需要其中包含实际>>> a.astype(float) + b.astype(float)
的任意对象数组,那么你可以这样做,然后将其转换为浮动数组,以获得好处NaN:
>>> a = np.array([1.0,np.nan,2.0])
>>> b = np.array([1.0,2.0,2.0])
>>> a + b
array([ 2., nan, 4.])
无论如何,在这种情况下,仅仅使用NaN是不够的:
>>> np.nan_to_num(a, 0)
array([1., 0., 2.0])
>>> np.nan_to_num(a, 0) + np.nan_to_num(b, 0)
array([2., 2., 4.])
那是因为NaN的语义是NaN的任何操作的结果都返回NaN。但是你想把它当作0。
但它确实使问题易于解决。解决这个问题的最简单方法是使用函数nan_to_num
:
#get all the columns except for 'a'
linearvars <- setdiff(colnames(data),'a')
linearphrase <- paste(linearvars, collapse=" + ")
#combine the linear terms with the rest of the formula
fullformula <- as.formula( paste0('y~rcs(a) + ', linearphrase) )