【问题标题】:Scipy quickly initialise sparse matrix from list of coordinatesScipy从坐标列表中快速初始化稀疏矩阵
【发布时间】:2013-09-11 17:59:33
【问题描述】:

我想从矩阵坐标和值的列表中初始化一个稀疏矩阵(如果重要,可以与 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 数组,设置值然后转换为稀疏不是一个选项。

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

【问题讨论】:

    标签: python numpy scipy


    【解决方案1】:

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

    构建矩阵的最简单方法是使用 COO(坐标)格式,这似乎与您的输入数据完美匹配:

    A = coo_matrix((values, coords.T))
    

    【讨论】:

    • 太棒了,这几乎是瞬间完成的。谢谢!
    • @user1356855:它是即时的,因为如果它们已经是正确类型的 NumPy 数组,它甚至不会复制数据或坐标(使用 np.intc 作为坐标)。
    猜你喜欢
    • 2020-07-08
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多