我需要对numpy数组进行逻辑迭代,其值取决于其他数组的元素。我在下面写了代码来澄清我的问题。有没有for循环解决这个问题的任何建议?
Code
a = np.array(['a', 'b', 'a', 'a', 'b', 'a'])
b = np.array([150, 154, 147, 126, 148, 125])
c = np.zeros_like(b)
c[0] = 150
for i in range(1, c.size):
if a[i] == "b":
c[i] = c[i-1]
else:
c[i] = b[i]
答案 0 :(得分:2)
这是一种方法,使用np.maximum.accumulate
和np.where
的组合来创建在某些时间间隔停止的步进索引,然后简单地索引到{ {1}}会给我们所需的输出。
因此,实现将是 -
b
逐步运行示例 -
mask = a!="b"
idx = np.maximum.accumulate(np.where(mask,np.arange(mask.size),0))
out = b[idx]
答案 1 :(得分:1)
您可以使用更加矢量化的方法,如下所示:
np.where(a == "b", np.roll(c, 1), b)
如果条件为np.where
, np.roll(c, 1)
将从True
获取元素;如果条件为b
,则False
将从np.roll(c, 1)
获取元素。 c
将" roll"将c[i-1]
的所有元素都转发1,以便每个元素都引用Process[] arrProcesses = Process.GetProcessesByName("javaw");
。
这些类型的操作使得numpy非常宝贵。如果可能,应该避免循环。
答案 2 :(得分:0)
如果你不需要包裹边缘,那么有一个非常简单的解决方案:
a = np.array(['a', 'b', 'a', 'a', 'b', 'a'])
b = np.array([150, 154, 147, 126, 148, 125])
c = b.copy() #removes necessity of else case
c[a[:-1]=='b'] = c[a[1:]=='b']
或同等地:
a = np.array(['a', 'b', 'a', 'a', 'b', 'a'])
b = np.array([150, 154, 147, 126, 148, 125])
c = b.copy() #removes necessity of else case
mask = a == 'b'
c[mask[:-1]] = c[mask[1:]]
如果你想绕过边距(a[0]=='b'
),那么它会变得更复杂一些,你需要先使用roll
或先用if
来抓住这个案例。< / p>