添加可能包含“None”条目的数组

时间:2018-04-26 17:34:03

标签: python numpy padding

我有一个关于添加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

3 个答案:

答案 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.nandtype的明确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) )