将列放入空稀疏矩阵

时间:2016-11-21 14:47:35

标签: python scipy sparse-matrix

我想将一个稀疏柱状矩阵中的列放入另一个(空)稀疏柱状矩阵中。 玩具代码:

import numpy as np
import scipy.sparse
row = np.array([0, 2, 0, 1, 2])
col = np.array([0, 0, 2, 2, 2])
data = np.array([1, 2, 4, 5, 6])
M=scipy.sparse.csc_matrix((data, (row, col)), shape=(3, 3))
E=scipy.sparse.csc_matrix((3, 3)) #empty 3x3 sparse matrix

E[:,1]=M[:,0]

但是我得到了警告:

  

SparseEfficiencyWarning:更改csc_matrix的稀疏结构是非常昂贵的。 lil_matrix效率更高。

这个警告让我担心在这个过程中矩阵被转换成另一种格式,然后再转换回csc,这是无效的。谁能证实这一点并有解决方案?

1 个答案:

答案 0 :(得分:0)

警告告诉您在csc(或csr)格式矩阵中设置新值的过程很复杂。这些格式不是为这样的简单更改而设计的。 lil格式旨在快速轻松地进行此类更改,尤其是在一行中进行更改。

请注意,coo格式甚至不会实现此类索引。

它无法转换为lil并返回,但实际上这可能是一种更快捷的方式。我们必须做一些时间测试。

In [679]: %%timeit E=sparse.csr_matrix((3,3))
     ...: E[:,1] = M[:,0]
     ...: 
/usr/lib/python3/dist-packages/scipy/sparse/compressed.py:730: SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient.
  SparseEfficiencyWarning)
1000 loops, best of 3: 845 µs per loop
In [680]: %%timeit E=sparse.csr_matrix((3,3))
     ...: E1=E.tolil()
     ...: E1[:,1] = M[:,0]
     ...: E=E1.tocsc()
     ...: 
The slowest run took 4.22 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 1.42 ms per loop

In [682]: %%timeit E=sparse.lil_matrix((3,3))
     ...: E[:,1] = M[:,0]
     ...: 
1000 loops, best of 3: 804 µs per loop
In [683]: %%timeit E=sparse.lil_matrix((3,3));M1=M.tolil()
     ...: E[:,1] = M1[:,0]
     ...: 
     ...: 
1000 loops, best of 3: 470 µs per loop

In [688]: timeit M1=M.tolil()
The slowest run took 4.10 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 248 µs per loop

请注意,使用lil(双方)进行分配比使用csc进行分配快2倍。但转换为lil或从In [835]: %%timeit E=sparse.csc_matrix((3,3)) ...: E[:,1]=M[:,0] SparseEfficiencyWarning) 1000 loops, best of 3: 1.89 ms per loop In [836]: %%timeit E=sparse.csc_matrix((3,3)) ...: E[1,:]=M[0,:] SparseEfficiencyWarning) 1000 loops, best of 3: 1.91 ms per loop 转换需要时间。

警告与否,您正在做的事情是最快的 - 对于一次性操作。但如果你需要反复这样做,试着找到一个更好的方法。

=================

设置行v列并没有太大的区别。

{{ form_row(form._token) }}