Как преобразовать numpy.matrix или массив в скудную разреженную матрицу - PullRequest
61 голосов
/ 28 октября 2011

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

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

Ответы [ 3 ]

99 голосов
/ 28 октября 2011

Вы можете передать массив или матрицу в качестве аргумента при инициализации разреженной матрицы. Например, для матрицы 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's 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
20 голосов
/ 28 октября 2011

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

bsr_matrix (arg1 [, shape, dtype, copy, blocksize]) Матрица разреженных блоков Block
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 хранилищем
dok_matrix (arg1 [, shape, dtype, copy]) Разреженная матрица Dictionary of Keys.
lil_matrix (arg1 [, shape, dtype, copy]) Sparse связанный список на основе строкmatrix

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

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.

0 голосов
/ 04 ноября 2015

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

...