添加可能包含 '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.])
我有一个关于添加 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.])