你有一个原始的稀疏矩阵X:
>>print type(X)
>>print X.todense()
<class 'scipy.sparse.csr.csr_matrix'>
[[1,4,3]
[3,4,1]
[2,1,1]
[3,6,3]]
你有第二个稀疏矩阵Z,它是从X的某些行得出的(比如说这些值加倍,所以我们可以看到两个矩阵之间的差异)。在pseudo-code
:
>>Z = X[[0,2,3]]
>>print Z.todense()
[[1,4,3]
[2,1,1]
[3,6,3]]
>>Z = Z*2
>>print Z.todense()
[[2, 8, 6]
[4, 2, 2]
[6, 12,6]]
使用X中的ORIGINAL索引检索Z中的行的最佳方法是什么。例如,在伪代码中:
>>print Z[[0,3]]
[[2,8,6] #0 from Z, and what would be row **0** from X)
[6,12,6]] #2 from Z, but what would be row **3** from X)
也就是说,如何使用引用原始矩阵X中原始行位置的索引从Z检索行?要做到这一点,你无论如何都不能修改X(你不能将索引列添加到矩阵X),但是没有其他限制。
答案 0 :(得分:1)
如果数组i
中有原始索引,并且i
中的值按递增顺序排列(如示例所示),则可以使用numpy.searchsorted(i,[0, 3])找到Z中与原始X中的索引[0,3]相对应的索引。这是IPython会话中的演示:
In [39]: X = csr_matrix([[1,4,3],[3,4,1],[2,1,1],[3,6,3]]) In [40]: X.todense() Out[40]: matrix([[1, 4, 3], [3, 4, 1], [2, 1, 1], [3, 6, 3]]) In [41]: i = array([0, 2, 3]) In [42]: Z = 2 * X[i] In [43]: Z.todense() Out[43]: matrix([[ 2, 8, 6], [ 4, 2, 2], [ 6, 12, 6]]) In [44]: Zsub = Z[searchsorted(i, [0, 3])] In [45]: Zsub.todense() Out[45]: matrix([[ 2, 8, 6], [ 6, 12, 6]])