2016-09-30 52 views
0

這裏是我的問題:
我想定義一個人的數組,並在for循環中更改此數組的條目。由於我也希望看到由此產生的分佈的漸近性,所以我想重複這個模擬安靜很多,因此我使用矩陣來存儲每行中的幾個數組。我知道如何與兩個for循環做到這一點:Python:並行編輯矩陣行

import random 
import numpy as np 

nobs = 100 
rep = 10**2 
steps = 10**2 
dmoney = 1 
state = np.matrix([[10] * nobs] * rep) 
for i in range(steps): 
    for j in range(rep) 
     sample = random.sample(range(state.shape[1]),2) 
     state[j,sample[0]] = state[j,sample[0]] + dmoney 
     state[j,sample[1]] = state[j,sample[1]] - dmoney 

我以爲我用的是多進程庫,但我不知道如何做到這一點,因爲在我的頭腦簡單,工人操縱相同的全局矩陣平行,我讀的是不是一個好主意。
那麼,我該如何做,加快計算?

在此先感謝。

+0

我不明白你的觀點,對不起。一個線程是否總是隻修改一列/每行或每個數據? – Mijago

+0

目前還不清楚是什麼你的我環路是做你不REF我(假設你使用它在一些未示出的代碼與仿真,分佈Ca​​lcs(計算)做的。)不過,我認爲你可以做你的j循環的一個numpy的聲明。但我真的沒有想到,通過(np.random.choice做類似的工作,python.random.sample) – paddyg

+0

我謹行編輯矩陣行,直到整個矩陣改變,並且重複此步驟幾次。 我沒有發佈的是樣本生成和平均步驟的功能。前者是反對np.random.choice的論據,後者是逐行編輯的參數,直到整個矩陣發生改變。 – Daniel

回答

0

OK,所以這可能沒有多大用處,我還沒有成型,看看是否有一個加速,但列表內涵會比正常循環快一點呢。

... 
y_ix = np.arange(rep) # create once as same for each loop 
for i in range(steps): 
    # presumably the two locations in the population to swap need refreshing each loop 
    x_ix = np.array([np.random.choice(nobs, 2) for j in range(rep)]) 
    state[y_ix, x_ix[:,0]] += dmoney 
    state[y_ix, x_ix[:,1]] -= dmoney 

PS numpy在多個處理器上的拆分取決於編譯時包含的庫(BLAS等)。你將能夠在網上找到關於這方面的信息。

編輯我可以確認,比較原始與上面的numpy索引版本後,原來的方法更快!