Изменить массив NumPy на основе предыдущего значения - PullRequest
0 голосов
/ 31 августа 2018

У меня есть массив np, скажем,

[1, 1, 1, 1, 0, 1, 0, 1, 0]

Теперь я хочу изменить число в index i s.t. это 0, если один из предыдущих n элементов был 1. Но это вычисление должно быть не статическим по отношению к исходному массиву, а динамическим, т.е. с учетом уже измененных значений. Допустим, n = 2, тогда я хочу получить

[1, 0, 0, 1, 0, 0, 0, 1, 0]

Как мне сделать это эффективно без цикла for? Простая индексация будет выполняться по всему массиву за одну итерацию, игнорируя вновь измененные значения, что означает, что результат будет

[1, 0, 0, 0, 0, 0, 0, 0, 0]

право

Обновление: В цикле я бы сделал это:

for i in range(a.shape[0]):
    FoundPrevious = False
    for j in range(n):
        if i - j < 0:
            continue
        if a[i - j] == 1:
            FoundPrevious = True
            break
    if FoundPrevious:
        a[i] = 0

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Как отмечали другие авторы и комментаторы, внутренняя интерактивная природа проблемы делает решение без цикла for неочевидным.

Другой подход к упрощению этой проблемы:

import numpy as np

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

for i in range(a.shape[0]):
    i0 = i - 2 if i >= 2 else 0
    if 1 in a[i0:i]:
        a[i] = 0

print(a)
# [1 0 0 1 0 0 0 1 0]
0 голосов
/ 31 августа 2018

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

arr = [1, 1, 1, 1, 0, 1, 0, 1, 0]
n = 2
newarr = []

for i in arr:
    newarr.append(0 if sum(newarr[-n:]) else i)

print (newarr)
[1, 0, 0, 1, 0, 0, 0, 1, 0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...