我有一个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
答案 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]