scipy.sparse.csgraph.

csgraph_to_dense#

scipy.sparse.csgraph.csgraph_to_dense(csgraph, null_value=0)#

Преобразовать разреженное представление графа в плотное представление

Добавлено в версии 0.11.0.

Параметры:
csgraphcsr_array, csc_array или lil_array

Разреженное представление графа.

null_valuefloat, опционально

Значение, используемое для обозначения нулевых рёбер в плотном представлении. По умолчанию 0.

Возвращает:
графndarray

Плотное представление разреженного графа.

Примечания

Для обычных разреженных представлений графов вызов csgraph_to_dense с null_value=0 дает эквивалентный результат использованию преобразований в плотном формате в основном пакете sparse. Однако, когда разреженные представления имеют повторяющиеся значения, результаты будут отличаться. Инструменты в scipy.sparse будут складывать повторяющиеся значения для получения итогового значения. Эта функция выберет минимальное среди повторяющихся значений для получения итогового значения. Например, здесь мы создадим направленный разреженный граф с двумя узлами и несколькими ребрами от узла 0 к узлу 1 с весами 2 и 3. Это иллюстрирует разницу в поведении:

>>> from scipy.sparse import csr_array, csgraph
>>> import numpy as np
>>> data = np.array([2, 3])
>>> indices = np.array([1, 1])
>>> indptr = np.array([0, 2, 2])
>>> M = csr_array((data, indices, indptr), shape=(2, 2))
>>> M.toarray()
array([[0, 5],
       [0, 0]])
>>> csgraph.csgraph_to_dense(M)
array([[0., 2.],
       [0., 0.]])

Причина этого различия заключается в том, чтобы разрешить сжатому разреженному графу представлять несколько рёбер между любыми двумя узлами. Поскольку большинство алгоритмов для разреженных графов рассматривают единственное ребро с наименьшей стоимостью между любыми двумя узлами, стандартное поведение scipy.sparse, суммирующее несколько весов, не имеет смысла в этом контексте.

Другая причина использования этой процедуры — возможность работы с графами, имеющими рёбра нулевого веса. Рассмотрим пример направленного графа с двумя узлами, соединённых ребром веса ноль:

>>> from scipy.sparse import csr_array, csgraph
>>> data = np.array([0.0])
>>> indices = np.array([1])
>>> indptr = np.array([0, 1, 1])
>>> M = csr_array((data, indices, indptr), shape=(2, 2))
>>> M.toarray()
array([[0., 0.],
       [0., 0.]])
>>> csgraph.csgraph_to_dense(M, np.inf)
array([[inf,  0.],
       [inf, inf]])

В первом случае ребро с нулевым весом теряется в плотном представлении. Во втором случае мы можем выбрать другое нулевое значение и увидеть истинную форму графа.

Примеры

>>> from scipy.sparse import csr_array
>>> from scipy.sparse.csgraph import csgraph_to_dense
>>> graph = csr_array( [
... [0, 1, 2, 0],
... [0, 0, 0, 1],
... [0, 0, 0, 3],
... [0, 0, 0, 0]
... ])
>>> graph

    with 4 stored elements and shape (4, 4)>
>>> csgraph_to_dense(graph)
array([[0., 1., 2., 0.],
       [0., 0., 0., 1.],
       [0., 0., 0., 3.],
       [0., 0., 0., 0.]])