如何解决具有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):
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微秒。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。