【发布时间】: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 毫秒
【问题讨论】:
-
您在时间测试中使用的变量与其他变量不匹配。索引稀疏矩阵本来就很慢。
标签: python numpy matrix scipy sparse-matrix