Вопрос по linear-algebra, math, sparse-matrix, python – Как изменить элементы в разреженной матрице в Python SciPy?

16

Я построил небольшой код, который хочу использовать для решения задач на собственные значения, связанных с большими разреженными матрицами. Это'работает нормально, все, что я хочу сейчас сделать - это установить некоторые элементы в разреженной матрице на ноль, то есть элементы в самой верхней строке (что соответствует реализации граничных условий). Я могу просто настроить векторы столбцов (C0, C1 и C2) ниже, чтобы добиться этого. Однако мне было интересно, есть ли более прямой путь. Очевидно, что индексирование NumPy не работает с SciPy 'редкий пакет.

import scipy.sparse as sp
import scipy.sparse.linalg  as la
import numpy as np
import matplotlib.pyplot as plt

#discretize x-axis
N = 11
x = np.linspace(-5,5,N)
print(x)
V = x * x / 2
h = len(x)/(N)
hi2 = 1./(h**2)
#discretize Schroedinger Equation, i.e. build 
#banded matrix from difference equation
C0 = np.ones(N)*30. + V
C1 = np.ones(N) * -16.
C2 = np.ones(N) * 1.
diagonals = np.array([-2,-1,0,1,2])
H = sp.spdiags([C2, C1, C0,C1,C2],[-2,-1,0,1,2], N, N)
H *= hi2 * (- 1./12.) * (- 1. / 2.)
#solve for eigenvalues
EV = la.eigsh(H,return_eigenvectors = False)

#check structure of H
plt.figure()
plt.spy(H)
plt.show()

Это визуализация матрицы, которая строится с помощью кода выше. Я хочу, чтобы установить элементы в первом ряду ноль.

Это'Это хорошо написанный вопрос, который может пригодиться другим в будущем. Как насчет публикации того, что вы нашли в качестве ответа? YXD
хорошо яя сделаю это seb
Я нашел работу вокруг. Формат, который я использую (dia_matrix), не подходит для того, чего я хочу достичь. Вместо этого я буду использовать csr_matrix. Должен ли я закрыть этот пост тогда? seb

Ваш Ответ

1   ответ
21

яВыложу ответ, который нашел, на свой вопрос. В SciPy есть несколько матричных классовс редким пакетом, они перечисленыВот, Можно преобразовать разреженные матрицы из одного класса в другой. Поэтому для того, что мне нужно сделать, я решил преобразовать свою разреженную матрицу в класс csr_matrix, просто

H = sp.csr_matrix(H)

Затем я могу установить элементы в первой строке на 0, используя обычную запись NumPy:

H[0,0] = 0
H[0,1] = 0
H[0,2] = 0

Для полноты я выложу полный фрагмент кода ниже.

#SciPy Sparse linear algebra takes care of sparse matrix computations
#http://docs.scipy.org/doc/scipy/reference/sparse.linalg.html
import scipy.sparse as sp
import scipy.sparse.linalg  as la

import numpy as np
import matplotlib.pyplot as plt

#discretize x-axis
N = 1100
x = np.linspace(-100,100,N)
V = x * x / 2.
h = len(x)/(N)
hi2 = 1./(h**2)

#discretize Schroedinger Equation, i.e. build 
#banded matrix from difference equation
C0 = np.ones(N)*30. + V
C1 = np.ones(N) * -16.
C2 = np.ones(N) * 1.

H = sp.spdiags([C2, C1, C0, C1, C2],[-2,-1,0,1,2], N, N)
H *= hi2 * (- 1./12.) * (- 1. / 2.)
H = sp.csr_matrix(H)
H[0,0] = 0
H[0,1] = 0
H[0,2] = 0

#check structure of H
plt.figure()
plt.spy(H)
plt.show()

EV = la.eigsh(H,return_eigenvectors = False)
Если вы собираетесь значительно изменить матрицу, матрица с разреженными связями на основе строк будет быстрее - тогда используйтеlil_matrix Toke Faurby
Если у вас больше строк, чем столбцов, csr работает быстрее, но если у вас больше столбцов, чем строк, csc работает быстрее. Ulf Aslak

Похожие вопросы