JoeyHoward988
JoeyHoward988

Reputation: 31

Rank issue with spdiags in Python

I am currently trying to create a sparse matrix that will look like this.

[[ 50. -25.   0.   0.]
 [-25.  50. -25.   0.]
 [  0. -25.  50. -25.]
 [  0.   0. -25.  50.]]

But when I run it through I keep getting the value error

'data array must have rank 2' in my data array.

I am positive it is a problem with my B variable. I have tried several things but nothing is working. Any advice?

    def sparse(a,b,N):
        h = (b-a)/(N+1)
        e = np.ones([N,1])/h**2
        B = np.array([e, -2*e, e])
        diags = np.array([-1,0,1])
        A = spdiags(B,diags,N,N).toarray()
        return A
    
    print(sparse(0,1,4))

Upvotes: 0

Views: 277

Answers (1)

Dani Mesejo
Dani Mesejo

Reputation: 61920

Just change to this:

import numpy as np
from scipy.sparse import spdiags


def sparse(a, b, N):
    h = (b - a) / (N + 1)
    e = np.ones(N) / h ** 2
    diags = np.array([-1, 0, 1])
    A = spdiags([-1 * e, 2 * e, -1 * e], diags, N, N).toarray()
    return A


print(sparse(0, 1, 4))

Output

[[-50.  25.   0.   0.]
 [ 25. -50.  25.   0.]
 [  0.  25. -50.  25.]
 [  0.   0.  25. -50.]]

The main change is this:

e = np.ones([N,1])/h**2

by

e = np.ones(N) / h ** 2

Note that toarray transforms the sparse matrix into a dense one, from the documentation:

Return a dense ndarray representation of this matrix.

Upvotes: 1

Related Questions