2010-02-25 3 views
2

В Numpy ix_() используется для захвата строк и столбцов матрицы, но, похоже, не работает с разреженными матрицами. Например, этот код работает, потому что он использует плотную матрицу:В SciPy использование 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 или эта функция просто не встроена в эти разреженные матрицы?

ответ

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]] 
+0

работает как шарм, спасибо! Хотя, похоже, он работает для csc и csr-матриц, но не для матриц lil - этого достаточно для меня. –

+0

Добро пожаловать! –

+0

Жаль, что разреженный синтаксис для нарезки немного отличается от плотного синтаксиса. 'xspar [[[0], [2]], [0,2]]' vs 'xdense [[[0], [2]], [[0,2]]]' – gabe