Я хочу создать в Python большую (скажем, 10^5 x 10^5) разреженную циркулянтную матрицу. Он имеет 4 элемента в строке в позициях [i,i+1], [i,i+2], [i,i+N-2], [i,i+N-1]
, где я принял периодические граничные условия для индексов (т. Е. [10^5,10^5]=[0,0], [10^5+1,10^5+1]=[1,1]
и т. Д.). Я посмотрел документацию на scipy редких матрицах, но я очень смущен (я новичок в Python).Создайте разреженную циркулянтную матрицу в python
я могу создать матрицу с NumPy
import numpy as np
def Bc(i, boundary):
"""(int, int) -> int
Checks boundary conditions on index
"""
if i > boundary - 1:
return i - boundary
elif i < 0:
return boundary + i
else:
return i
N = 100
diffMat = np.zeros([N, N])
for i in np.arange(0, N, 1):
diffMat[i, [Bc(i+1, N), Bc(i+2, N), Bc(i+2+(N-5)+1, N), Bc(i+2+(N-5)+2, N)]] = [2.0/3, -1.0/12, 1.0/12, -2.0/3]
Однако, это довольно медленно и для больших N
использует много памяти, поэтому я хочу, чтобы избежать создания с NumPy и преобразование в разреженные матрицы и перейти непосредственно к последнему.
Я знаю, как это сделать в Mathematica, где можно использовать SparseArray и шаблоны индексов - здесь что-то похожее?
Точно то, что я хотел! Я знал о 'scipy.linalg.circulant', но я понятия не имел о' scipy.sparse.diags'. Большое спасибо! – ThunderBiggi