具有numpy的对称矩阵

|
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.7的一个)。 这是double for循环,效率很低...我将用numpy制作一些东西,我相信这可以大大加快速度吗? 有人知道如何进行吗? 非常感谢你!     
已邀请:
        您可以使用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微秒。     

要回复问题请先登录注册