Как преобразовать "SciPy разреженную матрицу" в "матрицу NumPy"?

Я использую функцию python, называемую "incidence_matrix (G)", которая возвращает матрицу инцидентов графика. Это из пакета Networkx. Проблема, с которой я столкнулся, - это тип возврата этой функции - "Scipy Sparse Matrix". Мне нужно иметь матрицу инцидентов в формате матрицы или массива numpy. Мне было интересно, есть ли какой-нибудь простой способ сделать это или нет? Или есть встроенная функция, которая может сделать это преобразование для меня или нет?

Спасибо

Ответ 1

scipy.sparse.*_matrix Имеет несколько полезных методов, например, если a, например, scipy.sparse.csr_matrix:

  • a.toarray() или aA - возвращает плотное ndarray представление этой матрицы. (numpy.array, рекомендуется)
  • a.todense() или aM - возвращает плотное матричное представление этой матрицы. (numpy.matrix)

Ответ 2

Самый простой способ - вызвать метод todense() для данных:

In [1]: import networkx as nx

In [2]: G = nx.Graph([(1,2)])

In [3]: nx.incidence_matrix(G)
Out[3]: 
<2x1 sparse matrix of type '<type 'numpy.float64'>'
    with 2 stored elements in Compressed Sparse Column format>

In [4]: nx.incidence_matrix(G).todense()
Out[4]: 
matrix([[ 1.],
        [ 1.]])

In [5]: nx.incidence_matrix(G).todense().A
Out[5]: 
array([[ 1.],
       [ 1.]])

Ответ 3

Я обнаружил, что в случае csr-матриц todense() и toarray() просто обертывают кортежи, а не создают форматированную версию данных в форме матрицы ndarray. Это неприменимо для классификаторов skmultilearn, которые я тренирую.

Я перевел его на lil matrix - формат numpy может точно разобрать, а затем запустить toarray() на этом:

sparse.lil_matrix(<my-sparse_matrix>).toarray()