创建未知大小的稀疏矩阵

creating sparse matrix of unknown size

例如,我有一个文本文件,每行表示图形上的一条边

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]

创建稀疏矩阵的原始且仍然是原型的方法是收集 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 中制作稀疏矩阵时,我使用了这种数据、col、行初始化,尽管巧妙地使用索引 assemble 来自没有循环的有限元块的那些数组。 )