在numpy数组中没有for循环迭代

时间:2016-12-20 14:38:55

标签: python numpy iterator vectorization

我需要对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]

3 个答案:

答案 0 :(得分:2)

这是一种方法,使用np.maximum.accumulatenp.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>