根据之前的值修改numpy数组

时间:2018-08-31 19:04:08

标签: python numpy

我有一个np数组,比如

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

现在,我想修改索引i s.t.上的数字。如果先前的n个元素之一为1,则该值为0.但是此计算对于原始数组而言不应是静态的,而应是动态的,即考虑已更改的值。假设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 :(得分:4)

该问题本质上是迭代的,但是您可以通过对列表进行一次传递来简化操作。

Observable

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)

答案 1 :(得分:1)

正如其他答复者和评论者所指出的那样,问题的固有交互性质使得解决方案无需明显的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]