我有一个文本文件,每行指示图表上的边缘,例如
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]
答案 0 :(得分:3)
创建稀疏矩阵的原始且仍然是典型的方法是收集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))
列表追加至少与行读取一样快,并且优于稀疏矩阵插入,即使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,行初始化,但巧妙地使用索引来从有限元块中组装那些没有循环的数组。)