【问题标题】:2D indexing of scipy sparse matrixscipy稀疏矩阵的二维索引
【发布时间】: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


【解决方案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()

【讨论】:

    猜你喜欢
    • 2012-01-15
    • 1970-01-01
    • 2020-10-16
    • 2014-05-14
    • 1970-01-01
    • 2011-09-18
    • 2017-03-26
    • 2017-03-31
    • 2023-04-10
    相关资源
    最近更新 更多