【问题标题】:creating sparse matrix of unknown size创建未知大小的稀疏矩阵
【发布时间】:2016-12-13 16:33:31
【问题描述】:

例如,我有一个文本文件,其中每条线表示图上的一条边

2 5 1

表示节点 2 和 5 之间的权重为 1 的边。我想使用这些元组创建一个稀疏邻接矩阵。通常,我会将稀疏矩阵初始化为

G = scipy.sparse.lil_matrix((n,n))

其中 n 是图中的节点数。但在这种情况下,我不知道“n”是什么。有没有比遍历文件的行以找到最大节点索引、创建 lil_matrix 然后再次遍历文件更有效的方法来创建矩阵?我目前的实现是这样的:

n = 0
with open(gfile) as f:
    for line in f:
        temp = map(int,line.split())
        n = np.max([n,temp[0],temp[1]])
G = sp.lil_matrix((n,n))
with open(gfile) as f:
    for line in f:
        temp = map(int,line.split())
        G[temp[0],temp[1]] = temp[2]

【问题讨论】:

    标签: python numpy scipy sparse-matrix


    【解决方案1】:

    创建稀疏矩阵的原始且仍然是原型的方法是收集row, col, data 数组(或列表)中的所有输入,并使用coo_matrix 构造矩阵。形状可以从这些输入(最大索引值)推导出来,也可以作为参数给出。

    调整您的代码

    row, col, data = [],[],[]
    with open(gfile) as f:
        for line in f:
            temp = map(int,line.split())
            # G[temp[0],temp[1]] = temp[2]
            data.append(temp[2])
            row.append(temp[0])
            col.append(temp[1])
    G = sparse.coo_matrix((data, (row,col))
    

    列表追加至少与行读取一样快,并且比稀疏矩阵插入更好,甚至lillil 分配也涉及列表追加)。

    我怀疑你也可以这样做:

    A = np.genfromtxt(gfile, dtype=int) # default white space delimiter
    # A should now be a 2d 3 column array
    G = sparse.coo_matrix((A[:,2], (A[:,0], A[:,1]))
    

    即使用genfromtxtloadtxt 读取整个文件,并根据结果列创建稀疏矩阵。

    (几年前我在 MATLAB 中制作稀疏矩阵时,我使用了这种数据、列、行初始化,尽管巧妙地使用索引从没有循环的有限元块中组装这些数组。)

    【讨论】:

    • 谢谢!在您的 loadtxt 评论中:我认为这会加载整个 txt 文件,我想避免这种情况,因为其中一些文件可能非常大。
    • 新的genfromtxt 采用max_rows 参数。所有版本都允许您通过自己的过滤器馈线。在任何情况下,genfromtxt 并不比您自己的行读取和解析快。它也在做同样的事情。
    猜你喜欢
    • 1970-01-01
    • 2021-09-22
    • 2012-01-10
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多