2

假设我们有几个数组(在我的例子中是三个:a1、、、a2a3。我们还有一组随机均匀分布的数字,r。它们的长度相同。我需要构建一个a由这三个初始a1,组合而成的数组a2a3以便如果r[i]满足特定条件 1,我们取a1[i]as a[i],如果满足条件 2,我们取a2[i], 和a3[i]条件 3。这三个条件是互斥的。

我为此写了一个for循环:

a = empty(len(r))
for i in range(len(r)):
    if r[i] <= p1:
        a[i] = a1[i]
    if p1 < r[i] <= (p1 + p2):
        a[i] = a2[i]
    if r[i] > (p1 + p2):
        a[i] = a3[i]  

这里条件 1、2、3 在每个“ if ...”之后表示。p1p2给出数字。这是蒙特卡洛模拟的一部分(数组a1a2也是a3具有给定分布的随机数)。它太慢了,我需要以某种方式对其进行矢量化,但不知道如何去做。哪个是最好的方法?非常感谢!

4

1 回答 1

4

使用numpy.select,它允许您从多个条件中进行选择:

conds = [r <= p1, r <= (p1 + p2), r > (p1 + p2)]
choices = [a1, a2, a3]
a = np.select(conds, choices)

在您的情况下,第三个条件实际上可以是任何计算结果为 True 的条件(例如,r == r)。

于 2013-10-01T13:14:38.620 回答