2011-06-01 123 views
1
from random import * 
N = 100 
gamma = 0.7 
connect = zeros((N,N)) 

for i in range(N): 
    for j in range(i+1): 
     if random() < gamma: 
      connect[i,j] = 1 
      connect[j,i] = 1 
     else: 
      connect[i,j] = 0 
      connect[j,i] = 0 

我试图做的是创建一个对称矩阵,填充0和1(概率为0.7)。 这里是double for循环,效率非常低......我会用numpy做些什么,我相信这可以加速很多事情? 有谁知道如何继续? 非常感谢!具有numpy的对称矩阵

回答

2

您可以使用numpy随机模块生成随机向量,并使用这些向量来为矩阵播种。例如:此斜使用numpy.diag,但可以做到这逐行组装上部或下部三角形部分,然后用除了形成对称矩阵

import numpy as np 

N = 100 
gamma = 0.7 
connect = np.zeros((N,N),dtype=np.int32) 

for i in range(0,N): 
     dval = np.diag((np.random.random_sample(size=(N-i))<gamma).astype(np.int32),i) 
     connect += dval 
     if (i>0): 
       connect += dval.T 

一样。我没有感觉可能会更快。


编辑: 其实此行明智的版本比对角线的版本,我想应该不会那么奇怪,因为内存访问它使用比斜纹组件模式快约5倍。

N = 100 
gamma = 0.7 
connect = np.zeros((N,N),dtype=np.int32) 

for i in range(0,N): 
    rval = (np.random.random_sample(size=(N-i))<gamma).astype(np.int32) 
    connect[i,i:] = rval 

connect += np.triu(connect,1).T 

EDIT 2

这是更简单,比上述在行版本快约4倍。这里三角矩阵从权重的全矩阵直接形成,然后添加到它的转置,以产生对称矩阵:

N = 100 
gamma = 0.7 
a=np.triu((np.random.random_sample(size=(N,N))<gamma).astype(np.int32)) 
connect = a + np.triu(a,1).T 

在我测试Linux系统中,第1版大约需要6.5毫秒,第2版大约需要1.5毫秒,版本3大约需要450微秒。

+0

不错。这是最有帮助的,我真的很感激!它完美地运作 – Aurelio 2011-06-01 11:20:56

+0

如果你发现答案解决了你的问题,那么也许你可以如此接受答案。 – talonmies 2011-06-01 11:46:24