对稀疏 scipy 矩阵进行切片以对每 10 行和每列进行二次采样

Posted

技术标签:

【中文标题】对稀疏 scipy 矩阵进行切片以对每 10 行和每列进行二次采样【英文标题】:Slicing a sparse scipy matrix to subsample for every 10th row and column 【发布时间】:2013-10-22 12:01:59 【问题描述】:

我正在尝试将 scipy 稀疏矩阵子采样为像这样的 numpy 矩阵,以获得每 10 行和每 10 列:

connections = sparse.csr_matrix((data,(node1_index,node2_index)),
                                shape=(dimensions,dimensions))
connections_sampled = np.zeros((dimensions/10, dimensions/10))
connections_sampled = connections[::10,::10]

但是,当我运行它并查询connections_sampled 的形状时,我得到的是连接的原始尺寸,而不是减少了10 倍的尺寸。

这种类型的子采样现在是否适用于稀疏矩阵?当我使用较小的矩阵时,它似乎有效,但我无法给出正确的答案。

【问题讨论】:

【参考方案1】:

您不能对 CSR 矩阵的每 10 行和每列进行一次采样,至少在 Scipy 0.12 中不行:

>>> import scipy.sparse as sps
>>> a = sps.rand(1000, 1000, format='csr')
>>> a[::10, ::10]
Traceback (most recent call last):
...    
ValueError: slicing with step != 1 not supported

不过,您可以通过先转换为 LIL 格式矩阵来做到这一点:

>>> a.tolil()[::10, ::10]
<100x100 sparse matrix of type '<type 'numpy.float64'>'
    with 97 stored elements in LInked List format>

如您所见,形状已正确更新。如果您想要一个 numpy 数组,而不是稀疏矩阵,请尝试:

>>> a.tolil()[::10, ::10].A
array([[ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       ..., 
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.]])

【讨论】:

以上是关于对稀疏 scipy 矩阵进行切片以对每 10 行和每列进行二次采样的主要内容,如果未能解决你的问题,请参考以下文章

在 Scipy 中切片稀疏矩阵——哪种类型效果最好?

巨大的稀疏数据帧到 scipy 稀疏矩阵,无需密集变换

Scipy---6.稀疏矩阵

哪个 SciPy 稀疏矩阵类最适合计算距离矩阵?

python中scipy学习——随机稀疏矩阵及操作

scipy.sparse.linalg.spsolve Linux 系统上大型稀疏矩阵的令人惊讶的行为