Scipy从坐标列表中快速初始化稀疏矩阵

use*_*855 6 python numpy scipy

我想从矩阵坐标和值列表中初始化稀疏矩阵(如果重要的话,用于scipy minimum_spanning_tree).

也就是说,我有:

coords - Nx2 array of coordinates to be set in matrix
values - Nx1 array of the values to set.
Run Code Online (Sandbox Code Playgroud)

我试图使用lil_matrix来创建这个数组

A = lil_matrix((N,N))
A[coords[:,0],coords[:,1]] = values
Run Code Online (Sandbox Code Playgroud)

这是无法忍受的缓慢.实际上,在数组上循环并将每个元素设置为一个更快.即:

for i in xrange(N):
  A[coords[i,0],coords[i,1]] = values[i]
Run Code Online (Sandbox Code Playgroud)

这比上面稍快,但不多.因为数组太大,所以创建NxN数组,设置值然后转换为稀疏不是一种选择.

有更好的方法可以做到这一点,还是我坚持这是我的算法中最慢的部分?

Fre*_*Foo 6

LIL矩阵非常慢,因为它的构造算法需要二次时间.我不明白为什么SciPy文档仍然推荐它.

构建矩阵的最简单方法是使用COO(坐标)格式,它似乎完全符合您的输入数据:

A = coo_matrix((values, coords.T))
Run Code Online (Sandbox Code Playgroud)

  • @ user1356855:它是瞬时的,因为它甚至不复制数据或坐标,如果它们已经是正确类型的NumPy数组(对于坐标使用`np.intc`). (2认同)