创建未知大小的稀疏矩阵
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))
列表追加至少与行读取一样快,并且优于稀疏矩阵插入,甚至 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、行初始化,尽管巧妙地使用索引 assemble 来自没有循环的有限元块的那些数组。 )
例如,我有一个文本文件,每行表示图形上的一条边
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))
列表追加至少与行读取一样快,并且优于稀疏矩阵插入,甚至 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、行初始化,尽管巧妙地使用索引 assemble 来自没有循环的有限元块的那些数组。 )