В SciPy использование ix_ () с разреженными матрицами, похоже, не работает, так что еще я могу использовать? - PullRequest
2 голосов
/ 26 февраля 2010

В 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_ (), хотя не все они вызывают одно и то же исключение.

В приведенном мной примере использовалась матрица, которая была не очень большой или очень разреженной,но те, с которыми я имею дело, довольно редки и потенциально очень велики, поэтому не кажется разумным просто перечислять элементы один за другим.

Кто-нибудь знает (надеюсь, простой) способ сделать этот видиндексации с разреженными матрицами в SciPy или эта функция просто не встроена в эти разреженные матрицы?

1 Ответ

2 голосов
/ 26 февраля 2010

Попробуйте вместо этого:

>>> 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]]
...