Python 从多个阵列中构建一个阵列。蒙特卡罗方法

Python 从多个阵列中构建一个阵列。蒙特卡罗方法,python,numpy,montecarlo,Python,Numpy,Montecarlo,假设在我的例子中有几个数组,三个:a1,a2,a3。我们还有一个随机均匀分布数数组,r。它们的长度都一样。我需要构建一个数组a,将这三个初始a1,a2,a3组合起来,这样,如果r[I]满足一个特定的条件1,我们就把a1[I]作为一个[I],如果它满足条件2,我们就把a2[I]和a3[I]作为条件3。这三个条件是相互排斥的 我已经为此编写了一个for循环: a = empty(len(r)) for i in range(len(r)): if r[i] <= p1:

假设在我的例子中有几个数组,三个:a1,a2,a3。我们还有一个随机均匀分布数数组,r。它们的长度都一样。我需要构建一个数组a,将这三个初始a1,a2,a3组合起来,这样,如果r[I]满足一个特定的条件1,我们就把a1[I]作为一个[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之后表示。。。。p1和p2是给定的数字。这是蒙特卡罗模拟的一部分阵列a1、a2和a3也是具有给定分布的随机数。 它太慢了,我需要以某种方式将其矢量化,但不知道如何进行。哪种方式最好? 非常感谢

使用numpy.select,可以从多个条件中进行选择:

conds = [r <= p1, r <= (p1 + p2), r > (p1 + p2)]
choices = [a1, a2, a3]
a = np.select(conds, choices)
在您的情况下,第三个条件实际上可以是计算结果为True的任何条件,例如r==r。

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

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

在您的案例中,第三个条件实际上可能是任何计算结果为真的条件,例如,r==r。

对于小数组,循环可能会更快,但问题指出循环方法太慢,并询问如何矢量化,这向我表明她可能使用大数组。在我对10000个或更多元素的数组进行的测试中,numpy.select的速度是显式循环的20到30倍。对于小数组,循环可能会更快,但问题指出循环方法太慢,并询问如何矢量化,这向我暗示她可能使用的是大数组。在我的测试中,使用10000个或更多个元素的数组,NyPy.Cube的范围比显式循环快20到30倍。如果您满意地回答了您的问题,请考虑将答案标记为“接受”。如果满意地回答您的问题,请考虑将答案标记为“接受”。