В 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 или эта функция просто не встроена в эти разреженные матрицы?
работает как шарм, спасибо! Хотя, похоже, он работает для csc и csr-матриц, но не для матриц lil - этого достаточно для меня. –
Добро пожаловать! –
Жаль, что разреженный синтаксис для нарезки немного отличается от плотного синтаксиса. 'xspar [[[0], [2]], [0,2]]' vs 'xdense [[[0], [2]], [[0,2]]]' – gabe