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
,其中包含y
在x
的下标处的值。
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()