изменить форму матрицы scipy csr - PullRequest
0 голосов
/ 29 апреля 2018

Как я могу эффективно изменить форму и scipy.sparse csr_matrix?

Мне нужно добавить ноль строк в конце. Использование:

from scipy.sparse import csr_matrix
data = [1,2,3,4,5,6]
col = [0,0,0,1,1,1]
row = [0,1,2,0,1,2]
a = csr_matrix((data, (row, col)))
a.reshape(3,5)

Я получаю эту ошибку:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.5/dist-packages/scipy/sparse/base.py", line 129, in reshape
self.__class__.__name__)
NotImplementedError: Reshaping not implemented for csr_matrix.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Если вы можете обнаружить проблему достаточно рано, просто включите параметр формы:

In [48]: a = csr_matrix((data, (row, col)))
In [49]: a
Out[49]: 
<3x2 sparse matrix of type '<class 'numpy.int64'>'
    with 6 stored elements in Compressed Sparse Row format>
In [50]: a = csr_matrix((data, (row, col)),shape=(3,5))
In [51]: a
Out[51]: 
<3x5 sparse matrix of type '<class 'numpy.int64'>'
    with 6 stored elements in Compressed Sparse Row format>
In [52]: a.A
Out[52]: 
array([[1, 4, 0, 0, 0],
       [2, 5, 0, 0, 0],
       [3, 6, 0, 0, 0]], dtype=int64)

Вы также можете hstack на планшете. Убедитесь, что это редкая версия:

In [59]: z = sparse.coo_matrix(np.zeros((3,3)))
In [60]: z
Out[60]: 
<3x3 sparse matrix of type '<class 'numpy.float64'>'
    with 0 stored elements in COOrdinate format>
In [61]: sparse.hstack((a,z))
Out[61]: 
<3x5 sparse matrix of type '<class 'numpy.float64'>'
    with 6 stored elements in COOrdinate format>
In [62]: _.A
Out[62]: 
array([[1., 4., 0., 0., 0.],
       [2., 5., 0., 0., 0.],
       [3., 6., 0., 0., 0.]])

hstack использует sparse.bmat. Это объединяет атрибуты coo 2 массивов и создает новую матрицу coo.

0 голосов
/ 29 апреля 2018

Метод reshape() будет работать с csr_matrix объектами в scipy 1.1, который близок к выпуску. В то же время, вы можете попробовать код в Эффективно изменить форму разреженной матрицы, Python, SciPy 0.12 для изменения формы разреженной матрицы.

Однако ваш пример не сработает, потому что вы пытаетесь преобразовать массив с формой (3, 2) в массив с формой (3, 5). Код, указанный выше, и метод разреженного reshape() следуют тем же правилам, что и метод числовых массивов reshape(): вы не можете изменить общий размер массива.

Если вы хотите изменить общий размер, вы в конечном итоге сможете использовать метод resize() (который работает на месте), но это также новая функция scipy 1.1, поэтому он еще не выпущен.

Вместо этого вы можете построить новую разреженную матрицу следующим образом:

In [57]: b = csr_matrix((a.data, a.indices, a.indptr), shape=(3, 5))

In [58]: b.shape
Out[58]: (3, 5)

In [59]: b.A
Out[59]: 
array([[1, 4, 0, 0, 0],
       [2, 5, 0, 0, 0],
       [3, 6, 0, 0, 0]], dtype=int64)
...