1

元の疎行列 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]]

X のいくつかの行から派生した 2 番目のスパース行列 Z があります (2 つの行列の違いを確認できるように、値が 2 倍になっているとします)。で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 にインデックス列を追加することはできません) が、他に制限はありません。

4

1 に答える 1

1

array に元のインデックスがiあり、値iが(例のように)昇順である場合、 numpy.searchsorted(i, [0, 3]) を使用して、インデックスに対応する Z のインデックスを見つけることができます[0, 3] は元の X に含まれています。IPython セッションでのデモは次のとおりです。

[39]: X = csr_matrix([[1,4,3],[3,4,1],[2,1,1],[3,6,3]])

[40]: X.todense()
アウト[40]:
行列([[1, 4, 3],
        [3, 4, 1],
        [2、1、1]、
        [3, 6, 3]])

[41]: i = 配列([0, 2, 3])

[42]: Z = 2 * X[i]

[43]: Z.todense()
アウト[43]:
行列([[ 2, 8, 6],
        [ 4, 2, 2],
        [ 6, 12, 6]])

[44]: Zsub = Z[searchsorted(i, [0, 3])]

[45]: Zsub.todense()
アウト[45]:
行列([[ 2, 8, 6],
        [ 6, 12, 6]])

于 2012-09-07T11:56:12.877 に答える