2013-10-01 28 views
2

假設我們有幾個陣列(在我的情況下,三個:a1,a2,a3)。我們還有一組隨機均勻分佈的數字,r。它們的長度都一樣。我需要建立合併的那些陣列a三個初始a1a2a3使得如果r[i]滿足特定條件1,我們取a1[i]a[i],如果滿足條件2,我們採取a2[i],和a3[i]與條件3.三個條件是相互排斥的。建立一個數組。 Monte-Carlo方法

我寫了一個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。這是蒙特卡洛模擬的一部分(陣列a1,a2a3也是具有給定分佈的隨機數)。 它太慢了,我需要以某種方式對它進行矢量化,但不知道如何去做。哪種方法最好? 非常感謝!

+0

如果能滿意地解決您的問題,請考慮將答案標記爲「已接受」。 – askewchan

回答

4

使用numpy.select,它可以讓你從多個條件中進行選擇:

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

在你的情況下,第三個條件實際上可能是計算結果爲True任何條件(例如,r == r)。

+0

對於小型數組,循環可能會更快,但問題指出循環方法太慢,並且詢問如何進行矢量化,這向我建議她可能使用大型數組。在我對10000或更多元素數組的測試中,'numpy.select'的範圍比顯式循環快20到30倍。 – bogatron

相關問題