scipy稀疏矩阵的二维索引

Posted

技术标签:

【中文标题】scipy稀疏矩阵的二维索引【英文标题】:2D indexing of scipy sparse matrix 【发布时间】:2021-10-30 20:58:40 【问题描述】:
import numpy as np
import scipy.sparse

x = np.random.randint(0, 1000, (1000, 100))

# prob better way to do this
d = np.random.random((1000,1000))
d[d < 0.99] = 0
y = scipy.sparse.csr_matrix(d)

我想做的是在x 的索引处创建一个新矩阵z,其中包含y 的值。

即z的[0, 0]应该包含y[0, x[0, 0]]

[0, 1] of z 应该包含 y[0, x[0, 1]]

%time for i in range(1000): x[i, y[i]].todense()
~247ms
%time for i in range(1000): np.take(x[i].todense(), y[i])
~150ms

上述两种方法都有效,但我正在寻找一种更快的方法——这是目前我的代码的瓶颈。

请假设将整个 scipy.sparse 矩阵表示为稠密是不可行的。

编辑: %time z = np.vstack([q.todense()[0, p] for q, p in zip(x, y)])

约为 110 毫秒

【问题讨论】:

您在时间测试中使用的变量与其他变量不匹配。索引稀疏矩阵本来就很慢。 【参考方案1】:

答案似乎是使用适当形状的广播索引,如下所述:How to generate multi-dimensional 2D numpy index using a sub-index for one dimension (答案值得更多支持)!

%time res = y[np.arange(0, 1000).reshape((-1, 1)), x].todense()

【讨论】:

以上是关于scipy稀疏矩阵的二维索引的主要内容,如果未能解决你的问题,请参考以下文章

Scipy 稀疏矩阵作为 DataFrame 列

如何在 scipy 稀疏矩阵中确定索引数组的顺序?

scipy构建稀疏矩阵

使用 scipy 在 python 中构建和更新稀疏矩阵

用于 numpy 数组和 scipy 稀疏矩阵的 Tensordot

Python中的稀疏3d矩阵/数组?