2

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 で疎行列を使用してこの種のインデックス作成を行う (できれば簡単な) 方法を知っている人はいますか? それとも、この機能はこれらの疎行列に組み込まれていませんか?

4

1 に答える 1

2

代わりにこれを試してください:

>>> print xspar
  (0, 0) 1
  (0, 2) 3
  (1, 1) 4
  (1, 2) 5
  (2, 0) 7
  (2, 1) 8
>>> print xspar[[[0],[2]],[0,2]]
  (0, 0) 1
  (0, 2) 3
  (2, 0) 7

これとの違いに注意してください:

>>> print xspar[[0,2],[0,2]]
  [[1 0]]
于 2010-02-25T23:38:24.040 に答える