添加可能包含 'None' 个条目的数组

Adding arrays which may contain 'None'-entries

我有一个关于添加 numpy 数组的问题。 假设我定义了一个函数

def foo(a,b):
    return a+b

它采用两个相同形状的数组并简单地 returns 它们的总和。 现在,我必须处理一些条目可能是 None 的情况。 我想处理那些对应于 float(0) 的条目,这样

[1.0,None,2.0] + [1.0,2.0,2.0] 

加起来就是

[2.0,2.0,4.0]

你能给我提供一个已经实施的解决方案吗?

TIA

您可以使用 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.])

我建议 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.])

通常,这个问题的答案是使用浮点数数组,而不是任意对象数组,然后使用np.nan而不是None。 NaN 具有明确定义的算术语义。 (此外,使用浮点数组而不是对象将使您的代码显着增加时间并 space 高效。)


请注意,如果您使用 float 或 [=20= 的显式 dtype 构建数组,则不必手动将 None 转换为 np.nan ].这两个是等价的:

>>> a = np.array([1.0,np.nan,2.0])
>>> a = np.array([1.0,None,2.0],dtype=float)

这意味着,如果出于某种原因,您确实需要其中包含实际 None 的任意对象数组,您可以这样做,然后将其动态转换为浮点数数组以获得NaN 的好处:

>>> 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 的语义是对 NaN returns NaN 的任何操作的结果。但是你想把它当作 0.

但确实让问题很容易解决。解决这个问题的最简单方法是使用函数 nan_to_num:

>>> 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.])