【问题标题】:How to remove nan value from a list如何从列表中删除 nan 值
【发布时间】:2018-09-23 06:23:00
【问题描述】:

我有一个名为 Ave 的列表。Ave[0] 如下所示:

[array([ nan]),
 array([ 0.03030303]),
 array([ 0.025]),
 array([ 0.03546099]),
 array([ 0.02877698]),
 array([ 0.05343511]),
 array([ nan]),
 array([ nan])]

我需要从 Ave 中的每个列表中删除 nan 值。 我的代码运行缓慢:

for j in range(len(Ave)):
    c=0
    while c<8:
        for i in range(len(Ave[j])):
            if np.isnan(Ave[j][i])==True:
                del Ave[j][i]
                break
            c=c+1

如果有人给我更快的代码,我们将不胜感激。

【问题讨论】:

  • 你在使用numpy吗?如果是,请更新您的标签。
  • 你到底想做什么?列表总是长度为 8 吗? numpy 数组总是只有 1 个元素吗?更多详细说明可以帮助我们帮助您。

标签: python list numpy for-loop nan


【解决方案1】:

你也可以使用itertools.filterfalse:

Ave
# [array([nan]), array([0.03030303]), array([0.025]), array([0.03546099]), array([0.02877698]), array([0.05343511]), array([nan]), array([nan])]

list(itertools.filterfalse(np.isnan, Ave))
# [array([0.03030303]), array([0.025]), array([0.03546099]), array([0.02877698]), array([0.05343511])]

或者如果Ave 嵌套更深:

AveAveAve = np.random.randint(0, 3, (5, 5, 1))
AveAveAve = np.random.random((5, 5, 1)) * AveAveAve / AveAveAve
AveAveAve = list(map(list, AveAveAve))
AveAveAve
# [[array([0.25051587]), array([nan]), array([0.93294353]), array([0.45979654]), array([0.46274847])],
#  [array([nan]), array([0.36631801]), array([0.18432189]), array([0.10408241]), array([nan])],
#  [array([0.73367427]), array([0.93523268]), array([0.33142847]), array([nan]), array([0.84569255])],     
#  [array([0.95316363]), array([0.67298091]), array([0.06368582]), array([0.22668049]), array([0.14361035])],
#  [array([0.66480064]), array([0.91260134]), array([0.10735208]), array([0.55708037]), array([0.6402967])]]

list(map(list, map(itertools.filterfalse, itertools.repeat(np.isnan), AveAveAve)))
# [[array([0.25051587]), array([0.93294353]), array([0.45979654]), array([0.46274847])],
#  [array([0.36631801]), array([0.18432189]), array([0.10408241])],
#  [array([0.73367427]), array([0.93523268]), array([0.33142847]), array([0.84569255])],
#  [array([0.95316363]), array([0.67298091]), array([0.06368582]), array([0.22668049]), array([0.14361035])],
#  [array([0.66480064]), array([0.91260134]), array([0.10735208]), array([0.55708037]), array([0.6402967])]]

【讨论】:

    【解决方案2】:

    您可以使用列表推导:

    ave = [ [ n for n in row if not np.isnan(n)] for row in ave ]
    

    请注意,您的示例数据有点模棱两可,因为不清楚“Ave[0] 如下所示”是否意味着该列表具有三个维度或只有两个维度。您似乎不太可能想要一个第二维包含单元素数组列表的 3D 列表。 NaN 清理的结果将生成包含 0 或 1 个元素的数组列表的行。

    如果这确实是您正在使用的,那么解决方案中需要再嵌套一个列表理解,此时我建议将其分解为具有中间结果的步骤。

    例如:

    clearNaN  = lambda numberArray : [ n for n in numberArray if not np.isnan(n) ]
    clearList = lambda arrayList   : [ clearNaN(arr) for arr in arrayList ] 
    Ave       = [ clearList(row) for row in Ave ]
    

    【讨论】:

      【解决方案3】:

      如果我正确理解您的问题,这是一种方法。

      请注意,保存数组列表是低效的。建议尽可能将数据保存在单个 numpy 数组中。

      from numpy import array, isnan, nan
      
      Ave = [array([ nan]),
             array([ 0.03030303]),
             array([ 0.025]),
             array([ 0.03546099]),
             array([ 0.02877698]),
             array([ 0.05343511]),
             array([ nan]),
             array([ nan])]
      
      A = array(Ave)
      res = list(map(array, A[~isnan(A)]))
      
      # [array(0.03030303),
      #  array(0.025),
      #  array(0.03546099),
      #  array(0.02877698),
      #  array(0.05343511)]
      

      【讨论】:

        猜你喜欢
        • 2022-11-15
        • 2014-03-13
        • 2017-06-21
        • 2021-12-22
        • 2018-01-23
        • 2018-05-25
        • 1970-01-01
        • 2014-01-27
        • 1970-01-01
        相关资源
        最近更新 更多