使用另一个矩阵的索引引用矩阵中的行

时间:2012-09-07 11:24:10

标签: numpy scipy

你有一个原始的稀疏矩阵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),但是没有其他限制。

1 个答案:

答案 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]])