Hvordan til at ændre elementer i sparse matrix i Python ‘ s SciPy?

Jeg har bygget en lille kode, som jeg vil bruge til at løse egenværdi problemer, der involverer store sparse matricer. Det fungerer fint, alle jeg ønsker at gøre nu, er at der er nogle elementer i den sparsomme matrix til nul, dvs dem der er i den øverste række (hvilket svarer til gennemførelse af randbetingelser). Jeg kan bare justere kolonne vektorer (C0, C1 og C2) nedenfor for at nå det. Men jeg spekulerede på, om der er en mere direkte måde. Det er indlysende, at NumPy indeksering virker ikke med SciPy sparsomme pakke.

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()

Dette er en visualisering af den matrix, der er bygget af ovenstående kode. Jeg vil så sæt elementer i første række nul.Hvordan til at ændre elementer i sparse matrix i Python ' s SciPy?

Jeg fandt et arbejde rundt. Den format jeg bruger (dia_matrix) er ikke godt for de ønsker, jeg ønsker at opnå. Jeg vil bruge csr_matrix i stedet. Skal jeg lukke dette indlæg derefter?
det er en godt skrevet spørgsmål, og kan være nyttige for andre i fremtiden. Hvordan om udstationering, hvad du fandt så et svar?
ok, jeg vil gøre det

OriginalForfatteren seb | 2013-04-09

1 svar

  1. 21

    Som foreslået i kommentarerne, jeg vil sende det svar, som jeg fandt på mit eget spørgsmål. Der er flere matrix klasser i i SciPy sparsomme pakke, de er opført her. Man kan konvertere sparse matricer fra en klasse til en anden. Så til hvad jeg skal gøre, jeg vælger at konvertere min sparsomme matrix til klasse csr_matrix, blot ved at

    H = sp.csr_matrix(H)

    Så jeg kan sætte elementer i første række til 0 ved hjælp af det regulære NumPy notation:

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

    For fuldstændighedens skyld, skal jeg skrive den fulde ændret kodestykket nedenfor.

    #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)
    Hvis du har flere rækker end kolonner, csr er hurtig, men hvis du har flere kolonner, end rækker, csc er hurtigere.
    Hvis du vil ændre den matrix, en masse af en Række-baseret linkede liste sparsomme matrix er hurtigere – så brug lil_matrix

    OriginalForfatteren seb

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *