考虑以下numpy数组
x = np.array([1, 2, np.nan, np.nan, 3, 4, 5, np.nan])
我想提取x
中所有非NaN连续元素,并且预期的输出是列表
y = [[1, 2],[3, 4, 5]]
他们的任何方法都比简单的for
循环既优雅又快速吗?
答案 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
安装。