Как поднастроить элементы списка, которые l ie между двумя пропущенными значениями? - PullRequest
7 голосов
/ 06 марта 2020

Со списком, содержащим некоторые пропущенные значения, такие как это:

[10, 11, 12,np.nan, 14, np.nan, 16, 17, np.nan, 19, np.nan]

Как вы можете установить значения, расположенные между двумя пропущенными (nan) значениями?

Я знаю как это сделать с for loop:

# imports
import numpy as np

# input
lst=[10,11,12,np.nan, 14, np.nan, 16, 17, np.nan, 19, np.nan]

# define an empty list and build on that in a For Loop
subset=[]
for i, elem in enumerate(lst):
    if np.isnan(lst[i-1]) and np.isnan(lst[i+1]):
        subset.extend([elem])

print(subset)

# output
# [14, 19]

Есть какие-нибудь предложения о том, как сделать это менее громоздким способом?

Ответы [ 3 ]

7 голосов
/ 06 марта 2020

вы можете использовать встроенную функцию zip:

subset = [e2 for e1, e2, e3 in zip(lst, lst[1:], lst[2:]) if np.isnan(e1) and not np.isnan(e2) and np.isnan(e3)]
print(subset)

выход:

[14, 19]
7 голосов
/ 06 марта 2020

Я - NumPy noob, так что, вероятно, это можно сделать лучше ...

>>> a = np.array(lst)
>>> a[1:-1][np.isnan(a[:-2]) & np.isnan(a[2:])]
array([14., 19.])

Для моих примеров [1, np.nan] и [np.nan] в комментариях это создает пустой массив как предназначен.

Или, как прокомментировал Георгий, выполните isnan только один раз:

>>> a = np.array(lst)
>>> nan = np.isnan(a)
>>> a[1:-1][nan[:-2] & nan[2:]]
array([14., 19.])

Как прокомментировал kaya3, если в строке может быть три нана, эти решения будут включать средний в результате (как ваш оригинал). Вот тот, который не (для теста я заменил 14 с нан):

>>> a[1:-1][nan[:-2] & ~nan[1:-1] & nan[2:]]
array([19.])
6 голосов
/ 06 марта 2020

Использовать понимание списка

import numpy as np
lst=[10,11,12,np.nan, 14, np.nan, 16, 17, np.nan, np.nan, np.nan]
subset = [elem for i, elem in enumerate(lst) if i and i < len(lst)-1 and np.isnan(lst[i-1]) and np.isnan(lst[i+1]) and not np.isnan(elem)]
print(subset)

Исправлены ошибки, на которые указывали другие участники. Теперь это должно работать для всех случаев.

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