为什么我在 scipy 稀疏列切片时收到警告?

why do I get warning on scipy sparse column slicing?

Scipy csr_matrix 的稀疏文档说这种矩阵对于行切片是有效的。使用此代码:

import numpy as np
from scipy import sparse

dok = sparse.dok_matrix((5,1))
dok[1,0] = 1

data = np.array([0,1,2,3,4])
row = np.array([0,1,2,3,4])
col = np.array([0,1,2,3,4])
csr = sparse.csr_matrix((data, (row, col)))
csr[:, 0] += dok

我收到此警告:

SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient.

为什么我会收到此警告?

这与行与列无关。本质上,您是在强制 scipy 在两个数组的中间插入元素,正如警告所说,这很昂贵。

让我们看看就地修改前后csr的内部表示来证实这一点:

>>> csr.data
array([0, 1, 2, 3, 4], dtype=int64)
>>> csr.indices
array([0, 1, 2, 3, 4], dtype=int32)
>>> 
>>> csr[:, 0] += dok
/home/paul/lib/python3.6/site-packages/scipy/sparse/compressed.py:742: SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient.
  SparseEfficiencyWarning)
>>> csr.data
array([0, 1, 1, 2, 3, 4], dtype=int64)
>>> csr.indices
array([0, 0, 1, 2, 3, 4], dtype=int32)

背景知识:压缩的稀疏行和列格式基本上只存储非零值。他们以打包的方式使用向量以特定顺序存储非零值及其坐标。如果一个操作添加了新的非零值,它们通常不能被追加,而必须被插入,这就是我们在示例中看到的,也是它变得昂贵的原因。