Подтвердить что ты не робот

Как преобразовать numpy.matrix или массив в scipy разреженную матрицу

Для разреженной матрицы SciPy можно использовать todense() или toarray() для преобразования в матрицу NumPy или массив. Каковы функции для выполнения обратного?

Я искал, но понятия не имел, какие ключевые слова должны быть правильными.

4b9b3361

Ответ 1

Вы можете передать массив или матрицу numpy в качестве аргумента при инициализации разреженной матрицы. Например, для CSR-матрицы вы можете сделать следующее.

>>> import numpy as np
>>> from scipy import sparse
>>> A = np.array([[1,2,0],[0,0,3],[1,0,4]])
>>> B = np.matrix([[1,2,0],[0,0,3],[1,0,4]])

>>> A
array([[1, 2, 0],
       [0, 0, 3],
       [1, 0, 4]])

>>> sA = sparse.csr_matrix(A)   # Here the initialization of the sparse matrix.
>>> sB = sparse.csr_matrix(B)

>>> sA
<3x3 sparse matrix of type '<type 'numpy.int32'>'
        with 5 stored elements in Compressed Sparse Row format>

>>> print sA
  (0, 0)        1
  (0, 1)        2
  (1, 2)        3
  (2, 0)        1
  (2, 2)        4

Ответ 2

В scipy имеется несколько разреженных матричных классов.

bsr_matrix (arg1 [, shape, dtype, copy, blocksize]) Блочная матрица разреженных строк coo_matrix (arg1 [, shape, dtype, copy]) Редкая матрица в формате COOrdinate.
csc_matrix (arg1 [, shape, dtype, copy]) Сжатая матрица разреженных столбцов
csr_matrix (arg1 [, shape, dtype, copy]) Сжатая матрица разреженных строк dia_matrix (arg1 [, shape, dtype, copy]) Редкая матрица с DIAgonal storage
dok_matrix (arg1 [, shape, dtype, copy]) Словарь на основе разреженной матрицы. lil_matrix (arg1 [, shape, dtype, copy]) Строчная матрица с привязкой к строке на основе строки

Любой из них может выполнить преобразование.

import numpy as np
from scipy import sparse
a=np.array([[1,0,1],[0,0,1]])
b=sparse.csr_matrix(a)
print(b)

(0, 0)  1
(0, 2)  1
(1, 2)  1

См. http://docs.scipy.org/doc/scipy/reference/sparse.html#usage-information.

Ответ 3

Что касается обратного, функция inv(A), но я не буду рекомендовать ее использовать, поскольку для огромных матриц она очень вычислительно дорогостоящая и нестабильная. Вместо этого вы должны использовать приближение к обратному, или если вы хотите решить Ax = b, вам действительно не нужен A -1.