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
都不会比您自己读取和解析行快。它也在做同样的事情。