代码之家  ›  专栏  ›  技术社区  ›  J.Doe

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

  •  1
  • J.Doe  · 技术社区  · 6 年前

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

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

    它采用两个形状相同的数组,只返回它们的和。 现在,我必须处理一些条目可能没有的情况。 我想处理这些条目,因为它们对应于float(0),因此

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

    总计为

    [2.0,2.0,4.0]
    

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

    TIA公司

    3 回复  |  直到 6 年前
        1
  •  3
  •   sushain97    6 年前

    我建议 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.])
    
        2
  •  2
  •   abarnert    6 年前

    通常,解决方法是使用浮点数组,而不是任意对象数组,然后使用 np.nan 而不是 None .NaN具有定义良好的算术语义。(此外,使用浮点数组而不是对象将使您的代码大大节省时间和空间。)


    请注意,您不必手动转换 没有一个 NP南安 如果使用显式 dtype 属于 float np.float64 .这两项都是等效的:

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

    这意味着,如果出于某种原因,您确实需要具有实际 没有一个 在它们中,您可以这样做,然后动态地将其转换为浮点数组,以获得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的操作的结果都返回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.])
    
        3
  •  2
  •   Mazdak    6 年前

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