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の1)で満たされた対称行列を作成することです。これがdoubleforループで、非常に非効率的です... numpyで何かを作成します。これにより、処理速度が大幅に向上すると思いますか?誰かが続行する方法を知っていますか?どうもありがとうございます!

4

1 に答える 1

2

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マイクロ秒かかります。

于 2011-06-01T09:13:47.807 に答える