Какой самый Pythoni c способ заполнения левого NaN только нулями? - PullRequest
0 голосов
/ 14 марта 2020

Я хочу оптимизировать функцию numpy для заполнения части массива. Требуется 1D np.array() с nan внутри. Некоторые из них находятся слева, и я хочу, чтобы только они были заполнены нулями. Пример:

из этого:

np.array([ np.nan, np.nan, np.nan, 3, 4, 5, np.nan, 7, 8, 9, np.nan ])

Я хочу получить это:

np.array([ 0, 0, 0, 3, 4, 5, np.nan, 7, 8, 9, np.nan ])

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

Какой самый Pythoni c способ сделать это?

Ответы [ 3 ]

2 голосов
/ 14 марта 2020

Решение, аналогичное приведенному выше, с использованием np.min и np.where вместо max и np.argmax.

import numpy as np

x = np.array([ np.nan, np.nan, np.nan, 3, 4, 5, np.nan, 7, 8, 9, np.nan ])

x[0:np.min(np.where(~np.isnan(x)))] = 0

Я бы сказал, что это очень немного более читабельным, как в предложении «Установите все значения от индекса 0 до минимального индекса, где значение не от ноля до нуля».

1 голос
/ 14 марта 2020

Попробуйте:

import numpy as np

x=np.array([ np.nan, np.nan, np.nan, 3, 4, 5, np.nan, 7, 8, 9, np.nan ])

x[0:max(np.argmax(~np.isnan(x)),0)]=0

Выходы:

[ 0.  0.  0.  3.  4.  5. nan  7.  8.  9. nan]
0 голосов
/ 14 марта 2020

Я также нашел решение сам:

def left_zero_fill(x):
    if np.isfinite(x[0]): return x

    cumsum = np.cumsum(np.isnan(x))    
    x[ :np.argmax(cumsum[:-1]==cumsum[1:]) +1] = 0
    return x

Они имеют очень похожие времена выполнения. Различия минимальны и все они работают. Спасибо всем за помощь.


РЕДАКТИРОВАТЬ: замена not np.isnan на np.isfinite сделала его самой быстрой реализацией.

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