根据以前的值修改numpy数组

问题描述 投票:0回答:2

我说有一个np数组

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

现在我想修改索引i s.t的数字。它是0,如果前面的n个元素之一是1.但是这个计算不应该是原始数组的静态w.r.t,而是动态的,即考虑已经改变的值。假设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
python numpy
2个回答
4
投票

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

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]

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]
© www.soinside.com 2019 - 2024. All rights reserved.