对称矩阵与numpy

时间:2011-06-01 08:48:48

标签: loops matrix numpy symmetric

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)。 这是循环的双重,非常低效...我会用numpy制作一些东西,我相信这可以加速很多东西? 有谁知道怎么办? 非常感谢你!

1 个答案:

答案 0 :(得分: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微秒。