scipy稀疏矩阵的二维索引


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)

我想做的是创建一个新的矩阵z,其中包含yx的下标处的值。

ie [0,0] (z)应该包含y[0, x[0,0]]

z的[0,1]应该包含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。稀疏矩阵作为密集是不可行的。

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

~ 110 ms

答案似乎是使用适当形状的广播索引,如下所述:如何使用一维的子索引生成多维二维numpy索引(答案值得更多的赞)!

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

最新更新