Заполните значения в массиве numpy, которые находятся между определенным значением - PullRequest
0 голосов
/ 04 февраля 2020

Допустим, у меня есть массив, который выглядит следующим образом:

a = np.array([0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0])

Я хочу заполнить значения от 1 до 1. Так что это будет желаемый результат:

a = np.array([0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0])

Я посмотрел на этот ответ, который дает следующее:

array([0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
   1, 1]) 

Я уверен, что это ответ действительно близок к выводу, который я хочу. Однако, несмотря на то, что я пытался это делать бесчисленное количество раз, я не могу изменить этот код так, чтобы он работал так, как я хочу, поскольку я не настолько опытен с массивами numpy. Любая помощь высоко ценится!

Ответы [ 2 ]

4 голосов
/ 04 февраля 2020

Попробуйте это

b = ((a == 1).cumsum() % 2) | a

Out[10]:
array([0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0], dtype=int32)

Из @Paul Panzer: используйте ufunc.accumulate с bitwise_xor

b = np.bitwise_xor.accumulate(a)|a
1 голос
/ 04 февраля 2020

Попробуйте:

import numpy as np

num_lst = np.array(
[0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0])

i = 0
while i < len(num_lst): # Iterate through the list
    if num_lst[i]: # Check if element is 1 at i-th position
        if not num_lst[i+1]: # Check if next element is 0
            num_lst[i+1] = 1 # Change next element to 1
            i += 1 # Continue through loop
        else: # Check if next element is 1
            i += 2 # Skip next element
    else:
        i += 1 # Continue through loop


print(num_lst)

Вероятно, это не самый элегантный способ выполнить это, но он должен работать. По сути, мы просматриваем список, чтобы найти 1. Когда мы находим элемент, равный 1, мы проверяем, равен ли следующий элемент 0. Если это так, то мы заменяем следующий элемент на 1. Если следующий элемент равен 1, это означает, что мы должны прекратить изменять 0 на 1, поэтому перепрыгните через этот элемент и продолжите итерацию.

...