Как заполнить конкретные значения массива, индексы которых одинаково удалены от индексов до и после ненулевых значений? - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь изменить только нулевые значения массива, индекс которого (+ - 1) находится между другими индексами ненулевых значений.

Input:
a = pandas.Series(np.array[0,0,-2,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,-1,0])

Desired output:
[0,0,-2,0,0,0,999,0,0,0,5,0,0,0,999,0,0,0,-1,0]

Я решил проблему очень неэффективно с помощью цикла for, который завершается

Моя цель - сделать это с помощью numpy.where, но у меня нет идеи управлять индексами

margen = 1
extra_forc = 100
for i in range(extra_forc, len(a)-extra_forc):
    if a.values[i] != 0: continue
    past = np.nonzero(a.values[i-extra_forc:i][::-1])[0]
    fut = np.nonzero(a.values[i+1:i+1+extra_forc])[0]
    if len(past) > 0 and len(fut) > 0:
        if abs(np.amin(past) - np.amin(fut)) <= margen:
            a.values[i] = 999

Это то, что я сейчас пытаюсь безуспешно:

a = np.where((abs(np.amin(np.nonzero([a.shift(-i) for i in range(extra_forc)])[0], axis=0) - np.amin(np.nonzero([a.shift(i) for i in range(extra_forc)][::-1])[0], axis=0)) < margen), 999, a)

1 Ответ

0 голосов
/ 26 апреля 2019

Воодушевился и нашел лучшее решение. Вероятно, не самый лучший, но он работает довольно хорошо.

non_cero_idxs = np.nonzero(a)[0]
ceros_idxs = np.convolve(non_cero_idxs, [0.5, 0.5], mode='same').astype(dtype=np.int32)
a.loc[ceros_idxs[1:]] = 999
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...