Python 创建未知大小的稀疏矩阵

Python 创建未知大小的稀疏矩阵,python,numpy,scipy,sparse-matrix,Python,Numpy,Scipy,Sparse Matrix,例如,我有一个文本文件,其中每一行表示图形上的一条边 2 5 1 指示节点2和5之间权重为1的边。我想用这些元组创建一个稀疏邻接矩阵。通常,我会将稀疏矩阵初始化为 G = scipy.sparse.lil_matrix((n,n)) 其中n是图中的节点数。但在这种情况下,我不知道‘n’是什么。有没有比在文件行上循环查找max节点索引、创建lil_矩阵然后再次在文件上循环更有效的方法来创建矩阵?我目前的实施是: n = 0 with open(gfile) as f: for line

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

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

G = scipy.sparse.lil_matrix((n,n))
其中n是图中的节点数。但在这种情况下,我不知道‘n’是什么。有没有比在文件行上循环查找max节点索引、创建lil_矩阵然后再次在文件上循环更有效的方法来创建矩阵?我目前的实施是:

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]

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

调整您的代码

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))
列表附加至少与行读取一样快,并且比稀疏矩阵插入更好,甚至
lil
lil
赋值也涉及列表附加)

我想你也可以这样做:

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]))
即使用
genfromtxt
loadtxt
读取整个文件,并从结果列创建稀疏矩阵


(几年前,当我在MATLAB中创建稀疏矩阵时,我使用了这种数据,col,row初始化,不过巧妙地使用了索引,从没有循环的有限元块组装这些数组。)

谢谢!关于loadtxt注释:我认为这会加载整个txt文件,这是我想要避免的,因为其中一些文件可能相当大。而且所有版本都允许您通过自己的过滤器输入行。在任何情况下,
genfromtxt
都不会比您自己读取和解析行快。它也在做同样的事情。