2016-09-30 76 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索引版本后,原来的方法更快!