Numpy では、行列の行と列を取得するために ix_() が使用されますが、スパース行列では機能しないようです。たとえば、次のコードは密行列を使用しているため機能します。
>>> import numpy as np
>>> x = np.mat([[1,0,3],[0,4,5],[7,8,0]])
>>> print x
[[1 0 3]
[0 4 5]
[7 8 0]]
>>> print x[np.ix_([0,2],[0,2])]
[[1 3]
[7 0]]
ix_() を使用して、0 番目と 2 番目の行と列に対応する要素にインデックスを付けました。これにより、マトリックスの 4 つのコーナーが得られます。
問題は、ix_ がスパース行列では機能しないように見えることです。前のコードから続けて、次のことを試します。
>>> import scipy.sparse as sparse
>>> xspar = sparse.csr_matrix(x)
>>> print xspar
(0, 0) 1
(0, 2) 3
(1, 1) 4
(1, 2) 5
(2, 0) 7
(2, 1) 8
>>> print xspar[np.ix_([0,2],[0,2])]
この例外があることを示す大きなエラーメッセージが表示されます。
File "C:\Python26\lib\site-packages\scipy\sparse\compressed.py", line 138, in check_format
raise ValueError('data, indices, and indptr should be rank 1')
ValueError: data, indices, and indptr should be rank 1
SciPy が提供する他の疎行列形式でこれを試しましたが、すべてが同じ例外を発生させるわけではありませんが、いずれも ix_() で機能しないようです。
私が示した例では、それほど大きくも疎でもなかったマトリックスを使用しましたが、私が扱っているものは非常に疎で潜在的に非常に大きいため、要素を 1 つずつリストするのは賢明ではないようです。
SciPy で疎行列を使用してこの種のインデックス作成を行う (できれば簡単な) 方法を知っている人はいますか? それとも、この機能はこれらの疎行列に組み込まれていませんか?