numpy数组的逻辑迭代

时间:2016-12-20 13:07:34

标签: python numpy iterator vectorization

假设您有两个大小相等的列表。第一个列表仅包含0和1,第二个列表的初始值等于某个固定数。第二个数组的其他值取决于第一个列表的相同索引值。它们之间的关系是,如果第一个列表中的值等于0,则第二个列表的相同索引值等于前一个,在所有其他情况下,等于某个其他值。为了澄清我的问题,我在for循环的帮助下编写了下面的代码。在没有for循环的情况下解决这个问题的方法是什么?

Code
a = np.array([0, 1, 0, 0, 0, 1, 0, 0, 1])
b = np.zeros_like(a)
b[0] = 5
for i in range(1, a.size):
    if a[i] == 0:
        b[i] = b[i-1]
    else:
        b[i] = np.random.randint(5)

1 个答案:

答案 0 :(得分:2)

这是一种矢量化方法 -

offset = int(a[0]!=0)
N = (np.count_nonzero(a!=0)) - offset # no. of rand num to be generated
rand_num = np.append(5,np.random.randint(0,5,N))
out = rand_num[(a!=0).cumsum() - offset]