numpyランダムモジュールを使用してランダムベクトルを生成し、それらのベクトルを使用してマトリックスをシードすることができます。例えば:
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
これはを使用して対角線上numpy.diag
で行いますが、上三角部分または下三角部分を組み立てるために行方向に行い、次に加算を使用して対称行列を形成することができます。どちらが速いのかわからない。
編集:実際、この行単位のバージョンは対角バージョンよりも約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
編集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マイクロ秒かかります。