Как извлечь последовательные элементы из массива, содержащего NaN - PullRequest
10 голосов
/ 11 апреля 2019

Рассмотрим следующий массив numpy

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

Я хочу извлечь все не-NaN последовательные элементы в x, и ожидаемый результат - список

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

Является ли их любой метод, который одновременно элегантен и быстрее, чем простой цикл for?

Ответы [ 3 ]

5 голосов
/ 11 апреля 2019

с использованием 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]]
4 голосов
/ 11 апреля 2019

Вы можете использовать np.split:

np.split(x, np.where(np.diff(np.isnan(x), prepend=True))[0])[1::2]
#[array([1., 2.]), array([3., 4., 5.])]
0 голосов
/ 20 апреля 2019

Использование 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...