如何从包含NaN

时间:2019-04-11 14:27:30

标签: python numpy

考虑以下numpy数组

x = np.array([1, 2, np.nan, np.nan, 3, 4, 5, np.nan])

我想提取x中所有非NaN连续元素,并且预期的输出是列表

y = [[1, 2],[3, 4, 5]]

他们的任何方法都比简单的for循环既优雅又快速吗?

3 个答案:

答案 0 :(得分:5)

使用itertools.groupby

from itertools import groupby

result = [list(map(int,g)) for k,g in groupby(x, np.isnan) if not k]
print (result)
#[[1, 2], [3, 4, 5]]

答案 1 :(得分:4)

您可以使用np.split

np.split(x, np.where(np.diff(np.isnan(x), prepend=True))[0])[1::2]
#[array([1., 2.]), array([3., 4., 5.])]

答案 2 :(得分:0)

使用more_itertools.consecutive_groups

给出

import numpy as np

import more_itertools as mit


iterable = np.array([1, 2, np.nan, np.nan, 5, 6, 7, np.nan])

代码

[x for x in map(list, mit.consecutive_groups(iterable)) if len(x) != 1]
# [[1.0, 2.0], [5.0, 6.0, 7.0]]

等效地:

list(filter(lambda x: len(x) != 1, map(list, mit.consecutive_groups(iterable))))
# [[1.0, 2.0], [5.0, 6.0, 7.0]]

注意:more_itertools是第三方库。通过> pip install more_itertools安装。