我想从矩阵坐标和值列表中初始化稀疏矩阵(如果重要的话,用于scipy minimum_spanning_tree)。
也就是说,我有:
coords - Nx2 array of coordinates to be set in matrix
values - Nx1 array of the values to set.
我尝试使用lil_matrix使用
创建此数组A = lil_matrix((N,N))
A[coords[:,0],coords[:,1]] = values
这是无法忍受的缓慢。实际上,在数组上循环并将每个元素设置为一个更快。即:
for i in xrange(N):
A[coords[i,0],coords[i,1]] = values[i]
比上面稍快,但不多。因为数组太大,所以创建NxN数组,设置值然后转换为稀疏不是一种选择。
有没有更好的方法可以做到这一点,还是我坚持认为这是我算法中最慢的一部分?
答案 0 :(得分:6)
LIL矩阵可怕慢,因为它的构造算法需要二次时间。我不明白为什么SciPy文档仍然推荐它。
构建矩阵的最简单方法是使用COO(坐标)格式,它似乎完全符合您的输入数据:
A = coo_matrix((values, coords.T))