【问题标题】:Python: How to replace NaNs in array by other arrayPython:如何用其他数组替换数组中的 NaN
【发布时间】:2020-03-28 18:28:17
【问题描述】:

我有 2 个长度相同的 Numpy 数组

array([ 0.9737068 ,  NaN,  NaN, ..., -0.64236529,
       -0.88137541, -0.78318609])

array([ 0.9 ,  0.7643,  0.61, ..., -0.64236529,
       -0.88137541, -0.78318609])

在第一个数组中我有 NaN 值,如何将这些 NaN 值替换为第二个数组中的值。在这个例子中,我的第三个数组是:

array([ 0.9737068 ,  Nan => 0.7643,  NaN => 0.61 , ..., -0.64236529,
       -0.88137541, -0.78318609])

【问题讨论】:

  • 这是 numpy 吗??
  • 您想要一个新数组还是替换其中一个?
  • 是的,这是 numpy

标签: python arrays


【解决方案1】:

使用 Numpy,通过对两个数组应用布尔掩码来实现以下工作:

import numpy as np
x = np.array([0.9737068, np.nan, np.nan, -0.64236529, -0.88137541, -0.78318609])
y = np.array([0.9, 0.7643, 0.61, -0.64236529, -0.88137541, -0.78318609])

x[np.isnan(x)] = y[np.isnan(x)]

结果

In[1]:  x
Out[1]: 
array([ 0.9737068 ,  0.7643    ,  0.61      , -0.64236529, -0.88137541,
       -0.78318609])

注意使用%timeit 运行,此解决方案在重复运行中花费

【讨论】:

    【解决方案2】:

    Pythonic 解决方案:

    import numpy as np
    
    def no_nans_arrays(array_w_nans,array_no_nans):
        return np.array([array_w_nans[i] if not np.isnan(array_w_nans[i]) else array_no_nans[i] for i in range(len(array_w_nans))])
    
    

    【讨论】:

      【解决方案3】:

      如果不是 numpy,你可能会发现这个函数很有帮助:

      def swap(A,B,i,j):
          TEMP_B = B[j]
          B[j] = A[i]
          A[i] = TEMP_B
          return A,B
      

      遍历您的第一个数组if element is NaN,然后使用交换。

      取自this question。

      【讨论】:

        【解决方案4】:
        res = np.array([ a1 if not np.isnan(a1) else b1 for a1,b1 in zip(a, b) ])
        

        如果np.array 中的给定元素是np.NaN,则np.isnan 返回 False

        【讨论】:

        • 更 Pythonic 的解决方案是 if not np.isnan(a1) 而不是 if np.isnan(a1)==False
        猜你喜欢
        • 2021-12-08
        • 1970-01-01
        • 2017-12-17
        • 2021-09-08
        • 2019-02-06
        • 2013-07-30
        • 1970-01-01
        • 2015-03-02
        • 2021-08-25
        相关资源
        最近更新 更多