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稀疏矩阵的二维索引的主要内容,如果未能解决你的问题,请参考以下文章