Разреженные массивы (scipy.sparse)#

Пакет SciPy для двумерных разреженных массивов числовых данных.

Примечание

Этот пакет переходит на интерфейс массивов, совместимый с массивами NumPy, от старого интерфейса матриц. Мы рекомендуем использовать объекты массивов (bsr_array, coo_array, и т.д.) для всей новой работы.

При использовании интерфейса массива обратите внимание, что:

  • x * y больше не выполняет матричное умножение, а поэлементное умножение (как с массивами NumPy). Чтобы код работал как с массивами, так и с матрицами, используйте x @ y для умножения матриц.

  • Операции, такие как sum, которые раньше создавали плотные матрицы, теперь создают массивы, чье поведение при умножении отличается аналогичным образом.

  • Разреженные массивы используют стиль массивов slicing операции, возвращающие скаляры, 1D или 2D разреженные массивы. Если нужны 2D результаты, используйте соответствующий индекс. Например. A[:, i, None] или A[:, [i]].

  • Все индексные массивы для данного разреженного массива должны иметь одинаковый dtype. Например, для формата CSR, indices и indptr должны иметь одинаковый тип данных. Для COO каждый массив в coords должны иметь одинаковый dtype.

Утилиты построения (eye, kron, random, diags, и т.д.) имеют соответствующие замены (см. Построение разреженных массивов).

Для получения дополнительной информации см. Миграция с spmatrix на sparray.

Подмодули#

csgraph

Подпрограммы сжатых разреженных графов (scipy.sparse.csgraph)

linalg

Разреженная линейная алгебра (scipy.sparse.linalg)

Классы разреженных массивов#

bsr_array(arg1[, shape, dtype, copy, ...])

Разреженный массив в формате блочной разреженной строки.

coo_array(arg1[, shape, dtype, copy, maxprint])

Разреженный массив в формате COOrdinate.

csc_array(arg1[, shape, dtype, copy, maxprint])

Сжатый разреженный столбцовый массив.

csr_array(arg1[, shape, dtype, copy, maxprint])

Массив сжатых разреженных строк.

dia_array(arg1[, shape, dtype, copy, maxprint])

Разреженный массив с диагональным хранением (DIAgonal storage).

dok_array(arg1[, shape, dtype, copy, maxprint])

Разреженный массив на основе словаря ключей.

lil_array(arg1[, shape, dtype, copy, maxprint])

Разреженный массив на основе списка списков по строкам.

sparray()

Этот класс предоставляет базовый класс для всех разреженных массивов.

Построение разреженных массивов#

diags_array(diagonals, /, *[, offsets, ...])

Создать разреженный массив из диагоналей.

eye_array(m[, n, k, dtype, format])

Разреженный массив заданной формы с единицами на k-й диагонали и нулями в остальных местах.

random_array(shape, *[, density, format, ...])

Возвращает разреженный массив равномерно случайных чисел в [0, 1)

block_array(blocks, *[, format, dtype])

Построить разреженный массив из разреженных подблоков

Объединение массивов#

kron(A, B[, format])

кронекерово произведение разреженных матриц A и B

kronsum(A, B[, format])

кронекерова сумма квадратных разреженных матриц A и B

block_diag(mats[, format, dtype])

Построить блочно-диагональную разреженную матрицу или массив из предоставленных матриц.

tril(A[, k, format])

Вернуть нижнюю треугольную часть разреженного массива или матрицы

triu(A[, k, format])

Вернуть верхнюю треугольную часть разреженного массива или матрицы

hstack(blocks[, format, dtype])

Сложить разреженные матрицы горизонтально (по столбцам)

vstack(blocks[, format, dtype])

Сложить разреженные массивы вертикально (по строкам)

Инструменты для разреженных данных#

save_npz(file, matrix[, compressed])

Сохраните разреженную матрицу или массив в файл с использованием .npz формат.

load_npz(файл)

Загрузить разреженный массив/матрицу из файла с помощью .npz формат.

find(A)

Возвращает индексы и значения ненулевых элементов матрицы

get_index_dtype([arrays, maxval, check_contents])

На основе входных (целочисленных) массивов a, определить подходящий тип данных индекса, который может содержать данные в массивах.

safely_cast_index_arrays(A[, idx_dtype, msg])

Безопасное приведение индексов разреженного массива к idx_dtype.

Идентификация разреженных массивов#

issparse(x)

Является x разреженного массива или разреженной матрицы?

Классы разреженных матриц#

bsr_matrix(arg1[, shape, dtype, copy, ...])

Разреженная матрица в формате Block Sparse Row.

coo_matrix(arg1[, shape, dtype, copy, maxprint])

Разреженная матрица в формате COOrdinate.

csc_matrix(arg1[, shape, dtype, copy, maxprint])

Сжатая разреженная столбцовая матрица.

csr_matrix(arg1[, shape, dtype, copy, maxprint])

Сжатая разреженная матрица строк.

dia_matrix(arg1[, shape, dtype, copy, maxprint])

Разреженная матрица с диагональным хранением (DIAgonal storage).

dok_matrix(arg1[, shape, dtype, copy, maxprint])

Разреженная матрица на основе словаря ключей.

lil_matrix(arg1[, shape, dtype, copy, maxprint])

Разреженная матрица на основе списка списков по строкам.

spmatrix()

Этот класс предоставляет базовый класс для всех классов разреженных матриц.

Построение разреженных матриц#

eye(m[, n, k, dtype, format])

Разреженная матрица заданной формы с единицами на k-й диагонали и нулями в остальных местах.

identity(n[, dtype, format])

Единичная матрица в разреженном формате

diags(диагонали[, смещения, форма, формат, тип])

Построить разреженную матрицу из диагоналей.

spdiags(data, diags[, m, n, format])

Верните разреженную матрицу из диагоналей.

bmat(blocks[, format, dtype])

Построить разреженный массив или матрицу из разреженных подблоков

random(m, n[, density, format, dtype, rng, ...])

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

rand(m, n[, density, format, dtype, rng, ...])

Создаёт разреженную матрицу заданной формы и плотности с равномерно распределёнными значениями.

Объединение матриц использует те же функции, что и для Объединение массивов.

Идентификация разреженных матриц#

issparse(x)

Является x разреженного массива или разреженной матрицы?

isspmatrix(x)

Является x : MAINT: обновление встроенных лицензий после удаления scipy-sphinx-theme

isspmatrix_csc(x)

Является x типа csc_matrix?

isspmatrix_csr(x)

Является x типа csr_matrix?

isspmatrix_bsr(x)

Является x типа bsr_matrix?

isspmatrix_lil(x)

Является x типа lil_matrix?

isspmatrix_dok(x)

Является x типа dok_array?

isspmatrix_coo(x)

Является x типа coo_matrix?

isspmatrix_dia(x)

Является x типа dia_matrix?

Предупреждения#

SparseEfficiencyWarning

Предупреждение, выдаваемое когда операция неэффективна для разреженных матриц.

SparseWarning

Общее предупреждение для scipy.sparse.

Информация об использовании#

Доступно семь типов разреженных массивов:

  1. csc_array: формат сжатого разреженного столбца

  2. csr_array: формат сжатых строк

  3. bsr_array: формат блочной разреженной строки

  4. lil_array: формат списка списков

  5. dok_array: формат Dictionary of Keys

  6. coo_array: формат COOrdinate (также известный как IJV, triplet format)

  7. dia_array: диагональный формат DIA

Для эффективного построения массива используйте любой из coo_array, dok_array или lil_array. dok_array и lil_array поддерживают базовое срезы и расширенную индексацию с синтаксисом, аналогичным массивам NumPy. Формат COO не поддерживает индексацию (пока), но также может использоваться для эффективного построения массивов с использованием информации о координатах и значениях.

Несмотря на их сходство с массивами NumPy, настоятельно не рекомендуется использовать функции NumPy напрямую на этих массивах, потому что NumPy обычно обрабатывает их как общие объекты Python, а не как массивы, что приводит к неожиданным (и неверным) результатам. Если вы хотите применить функцию NumPy к этим массивам, сначала проверьте, есть ли у SciPy собственная реализация для данного класса разреженных массивов, или преобразовать разреженный массив в массив NumPy (например, используя toarray метод класса) перед применением метода.

Все преобразования между форматами CSR, CSC и COO являются эффективными операциями с линейным временем выполнения.

Для выполнения операций, таких как умножение или инверсия, сначала преобразуйте массив в формат CSC или CSR. lil_array формат построчный, поэтому преобразование в CSR эффективно, тогда как преобразование в CSC менее эффективно.

Произведение матрицы на вектор#

Для векторного произведения между 2D разреженным массивом и вектором используйте оператор matmul (т.е., @), который выполняет скалярное произведение (как dot метод):

>>> import numpy as np
>>> from scipy.sparse import csr_array
>>> A = csr_array([[1, 2, 0], [0, 0, 3], [4, 0, 5]])
>>> v = np.array([1, 0, -1])
>>> A @ v
array([ 1, -3, -1], dtype=int64)

Формат CSR особенно подходит для быстрых матрично-векторных произведений.

Пример 1#

Создать 1000x1000 lil_array и добавить некоторые значения к нему:

>>> from scipy.sparse import lil_array
>>> from scipy.sparse.linalg import spsolve
>>> from numpy.linalg import solve, norm
>>> from numpy.random import rand
>>> A = lil_array((1000, 1000))
>>> A[0, :100] = rand(100)
>>> A.setdiag(rand(1000))

Теперь преобразуйте его в формат CSR и решите A x = b для x:

>>> A = A.tocsr()
>>> b = rand(1000)
>>> x = spsolve(A, b)

Преобразовать её в плотный массив и решить, затем проверить, что результат одинаков:

>>> x_ = solve(A.toarray(), b)

Теперь мы можем вычислить норму ошибки с помощью:

>>> err = norm(x-x_)
>>> err < 1e-9
True

Он должен быть маленьким :)

Пример 2#

Создать массив в формате COO:

>>> from scipy import sparse
>>> from numpy import array
>>> I = array([0,3,1,0])
>>> J = array([0,3,1,2])
>>> V = array([4,5,7,9])
>>> A = sparse.coo_array((V,(I,J)),shape=(4,4))

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

Дублирующиеся записи (i,j) суммируются при преобразовании в CSR или CSC.

>>> I = array([0,0,1,3,1,0,0])
>>> J = array([0,2,1,3,1,0,0])
>>> V = array([1,1,1,1,1,1,1])
>>> B = sparse.coo_array((V,(I,J)),shape=(4,4)).tocsr()

Это полезно для построения матриц жесткости и масс в методе конечных элементов.

Дополнительные детали#

Индексы столбцов CSR не обязательно отсортированы. Аналогично для индексов строк CSC. Используйте .sorted_indices() и .sort_indices() методы, когда требуются отсортированные индексы (например, при передаче данных в другие библиотеки).