如何从列表中删除nan值

时间:2018-04-13 00:43:38

标签: python list numpy for-loop nan

我有一个名字是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

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

3 个答案:

答案 0 :(得分:1)

如果我理解你的问题,这是一种方式。

请注意,保存数组列表效率低下。建议尽可能将数据保存在一个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)]

答案 1 :(得分:0)

您可以使用列表推导:

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 ]

答案 2 :(得分:0)

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