【问题标题】:Fill nan in numpy array在numpy数组中填充nan
【发布时间】:2019-09-05 10:02:38
【问题描述】:

当左右非 nan 值匹配时,是否有直接的方法在 numpy 数组中填充 nan 值?

例如,如果我有一个包含 False、False、NaN、NaN、False 的数组,我希望 NaN 值也为 False。如果左右值不匹配,我希望它保持 NaN

【问题讨论】:

  • 尝试使用numpy.isnan()函数
  • False 是一个布尔值。 nan我们一个花车。
  • 如果你检查...。 a = np.array([np.NaN, False, np.NaN, True]) ... 将产生 ...。数组([nan, 0., nan, 1.]) ....显然你没有。你的实际数组是什么?
  • 数组的 dtype 和 shape 是什么?结果呢?

标签: numpy


【解决方案1】:

您的首要任务是可靠地识别np.nan 元素。因为它是一个唯一的浮点值,所以测试并非易事。 np.isnan 是最好的 numpy 工具。

要混合 boolean 和 float (np.nan),您必须使用 object dtype:

In [68]: arr = np.array([False, False, np.nan, np.nan, False],object)                                        
In [69]: arr                                                                                                 
Out[69]: array([False, False, nan, nan, False], dtype=object)

转换为浮点数会将 False 更改为 0(并将 True 更改为 1):

In [70]: arr.astype(float)                                                                                   
Out[70]: array([ 0.,  0., nan, nan,  0.])

np.isnan 是对nan 的一个很好的测试,但它只适用于浮点数:

In [71]: np.isnan(arr)                                                                                       
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-71-25d2f1dae78d> in <module>
----> 1 np.isnan(arr)

TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

In [72]: np.isnan(arr.astype(float))                                                                         
Out[72]: array([False, False,  True,  True, False])

您可以使用辅助函数和列表推导来测试对象数组(或列表):

In [73]: def foo(x): 
    ...:     try: 
    ...:         return np.isnan(x) 
    ...:     except TypeError: 
    ...:         return x 
    ...:                                                                                                     
In [74]: [foo(x) for x in arr]                                                                               
Out[74]: [False, False, True, True, False]

可靠地识别出nan 值后,您可以应用之前/之后的逻辑。我不确定列表或数组是否更容易(您的逻辑并不完全清楚)。

【讨论】:

    猜你喜欢
    • 2021-09-12
    • 2013-07-26
    • 1970-01-01
    • 2018-05-07
    • 2017-05-02
    • 2022-12-10
    • 2016-11-06
    • 1970-01-01
    • 2020-09-14
    相关资源
    最近更新 更多