Разреженные массивы (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.
Подмодули#
Классы разреженных массивов#
|
Разреженный массив в формате блочной разреженной строки. |
|
Разреженный массив в формате COOrdinate. |
|
Сжатый разреженный столбцовый массив. |
|
Массив сжатых разреженных строк. |
|
Разреженный массив с диагональным хранением (DIAgonal storage). |
|
Разреженный массив на основе словаря ключей. |
|
Разреженный массив на основе списка списков по строкам. |
|
Этот класс предоставляет базовый класс для всех разреженных массивов. |
Построение разреженных массивов#
|
Создать разреженный массив из диагоналей. |
|
Разреженный массив заданной формы с единицами на k-й диагонали и нулями в остальных местах. |
|
Возвращает разреженный массив равномерно случайных чисел в [0, 1) |
|
Построить разреженный массив из разреженных подблоков |
Объединение массивов#
|
кронекерово произведение разреженных матриц A и B |
|
кронекерова сумма квадратных разреженных матриц A и B |
|
Построить блочно-диагональную разреженную матрицу или массив из предоставленных матриц. |
|
Вернуть нижнюю треугольную часть разреженного массива или матрицы |
|
Вернуть верхнюю треугольную часть разреженного массива или матрицы |
|
Сложить разреженные матрицы горизонтально (по столбцам) |
|
Сложить разреженные массивы вертикально (по строкам) |
Инструменты для разреженных данных#
|
Сохраните разреженную матрицу или массив в файл с использованием |
|
Загрузить разреженный массив/матрицу из файла с помощью |
|
Возвращает индексы и значения ненулевых элементов матрицы |
|
На основе входных (целочисленных) массивов a, определить подходящий тип данных индекса, который может содержать данные в массивах. |
|
Безопасное приведение индексов разреженного массива к idx_dtype. |
Идентификация разреженных массивов#
|
Является x разреженного массива или разреженной матрицы? |
Классы разреженных матриц#
|
Разреженная матрица в формате Block Sparse Row. |
|
Разреженная матрица в формате COOrdinate. |
|
Сжатая разреженная столбцовая матрица. |
|
Сжатая разреженная матрица строк. |
|
Разреженная матрица с диагональным хранением (DIAgonal storage). |
|
Разреженная матрица на основе словаря ключей. |
|
Разреженная матрица на основе списка списков по строкам. |
|
Этот класс предоставляет базовый класс для всех классов разреженных матриц. |
Построение разреженных матриц#
|
Разреженная матрица заданной формы с единицами на k-й диагонали и нулями в остальных местах. |
|
Единичная матрица в разреженном формате |
|
Построить разреженную матрицу из диагоналей. |
|
Верните разреженную матрицу из диагоналей. |
|
Построить разреженный массив или матрицу из разреженных подблоков |
|
Сгенерировать разреженную матрицу заданной формы и плотности со случайно распределенными значениями. |
|
Создаёт разреженную матрицу заданной формы и плотности с равномерно распределёнными значениями. |
Объединение матриц использует те же функции, что и для Объединение массивов.
Идентификация разреженных матриц#
|
Является x разреженного массива или разреженной матрицы? |
|
Является x : MAINT: обновление встроенных лицензий после удаления scipy-sphinx-theme |
Является x типа csc_matrix? |
|
Является x типа csr_matrix? |
|
Является x типа bsr_matrix? |
|
Является x типа lil_matrix? |
|
Является x типа dok_array? |
|
Является x типа coo_matrix? |
|
Является x типа dia_matrix? |
Предупреждения#
Предупреждение, выдаваемое когда операция неэффективна для разреженных матриц. |
|
Общее предупреждение для |
Информация об использовании#
Доступно семь типов разреженных массивов:
csc_array: формат сжатого разреженного столбца
csr_array: формат сжатых строк
bsr_array: формат блочной разреженной строки
lil_array: формат списка списков
dok_array: формат Dictionary of Keys
coo_array: формат COOrdinate (также известный как IJV, triplet format)
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() методы, когда
требуются отсортированные индексы (например, при передаче данных в другие библиотеки).