我想将一个稀疏柱状矩阵中的列放入另一个(空)稀疏柱状矩阵中。 玩具代码:
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,这是无效的。谁能证实这一点并有解决方案?
答案 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) }}