2011-06-01 110 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