我说有一个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
问题本质上是迭代的,但您可以通过对列表进行一次传递来简化操作。
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]
正如其他答案和评论所指出的那样,问题的内在交互性使得没有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]