【问题标题】:Symmetrical matrix with numpy带有numpy的对称矩阵
【发布时间】:2011-06-01 08:48:47
【问题描述】:
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)。 这是双 for 循环,非常低效......我将用 numpy 制作一些东西,我相信这可以大大加快速度? 有谁知道如何进行? 非常感谢!

【问题讨论】:

    标签: loops matrix numpy symmetric


    【解决方案1】:

    您可以使用 numpy random 模块生成随机向量,并使用这些向量为矩阵播种。例如:

    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 微秒。

    【讨论】:

    • 不错。这是最有帮助的,我真的很感激!它完美地工作
    • 如果你发现答案解决了你的问题,那么也许你可以接受这个答案。
    猜你喜欢
    • 1970-01-01
    • 2011-02-04
    • 2015-05-08
    • 2019-01-27
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    相关资源
    最近更新 更多