In this Python tutorial, we will learn about the “**Scipy Linalg**“. Here we will learn how to solve linear algebra problems. And additionally, we will cover the following topics.

- Scipy Linalg
- Scipy Linalg Eig
- Scipy Linalg Eigh
- Scipy Linalg Lu
- Scipy Linalg Svd.
- Scipy Linalg Solve
- Scipy Linalg Qr
- Scipy Linalg Inverse
- Scipy Linalg Norm
- Scipy Linalg Cholesky

## Scipy Linalg

The

module in Python Scipy is used to solve linear algebra problems. We can use this library to solve equations, matrices, eigenvalues, and special matrix problems, among other things.*scipy.linalg*

It has a variety of approaches for solving problems in linear algebra. All of the methods in the

the library has been divided into the following sections:*linalg*

- Eigenvalue Problems
- Matrix Functions
- Basics
- Decompositions
- Sketches and Random Projections
- Low-Level Routines
- Matrix Equation Solvers
- Special Matrices

In the upcoming subsection, we will learn about the most common methods of the module

.*scipy.linalg*

## Scipy Linalg Eig

The Python Scipy has a method

within module *eig()*

to deal with common eigenvalue problems.*scipy.linalg*

The syntax is given below.

`scipy.linalg.eig(a, b=None, right=False, left=True, overwrite_a=True, overwrite_b=True, check_finite=False, homogeneous_eigvals=True)`

Where parameters are:

To provide the real or complex matrix as input for computing the eigenvector and eigenvalues.*a(array_data):*To input the right-hand side matrix.*b(array_data):*To compute and get the right eigenvectors.*right(boolean):*To compute and get the left eigenvectors.*left(boolean):*To overwrite*overwrite_a(boolean):*

.*a*To overwrite*overwrite_b(boolean):*

.*b*To check if the provided matrix as input has finite numbers.*check_finite(boolean):*To get the eigenvalues in homogenous coordinates*homogeneous_eigvals(boolean):*

The method

returns the *eig()*,

`w`

(the eigenvalues)**and**

`vr`

(the right vector that is normalized)**of type complex ndarray or double**

`vl`

(the left vector that is normalized)Let’s take an example by following the below steps:

Import the required libraries using the below python code.

```
import numpy as np
from scipy.linalg import eig
```

Create an array of data as a matrix using the below code.

`mat_data = np.array([[-1.,0],[0.2,1]])`

Pass the created matrix data to the method `eig()`

using the below code.

`eig(mat_data)`

This is how to compute the eigenvalues and eigenvectors using the method

of Python Scipy.*eig()*

Read: Scipy Convolve

## Scipy Linalg Eigh

The Python Scipy has a method

within module *eigh()*

to deal with standard ordinary eigenvalue problems for real symmetric or Hermitian matrices.*scipy.linalg*

The syntax is given below.

`scipy.linalg.eigh(a, b=None, eigvals_only=True, lower=False, overwrite_a=True, overwrite_b=True, turbo=False, eigvals=None, type=1, check_finite=False, subset_by_index=None, subset_by_value=None, driver=None)`

Where parameters are:

To provide the real or complex matrix as input for computing the eigenvector and eigenvalues.*a(array_data):*To input the right-hand side matrix.*b(array_data):*Whether the relevant array of data is chosen from the lower or upper triangle of a.*lower(bool):*To compute only the eigenvalues with no eigenvectors. By default, both are calculated.*egvals_only(boolean):*To overwrite*overwrite_a(boolean):*

.*a*To overwrite*overwrite_b(boolean):*

.*b*To check if the provided matrix as input has finite numbers.*check_finite(boolean):*To define the beginning and end eigenvalues indices using a two-element that is iterable.*subset_by_index(iterable):*To define the half interval to get only eigenvalues using a two-element that is iterable.*subset_by_value(iterable):*

The method

returns the *eigh()* in increasing size of type ndarray.

`w`

(selected eigenvalues)Let’s an example by following the below steps:

Import the required library using the below python code.

```
import numpy as np
from scipy.linalg import eigh
```

Create an array of data as a matrix using the below code.

`matrix_data = np.array([[5, 3, 6, 1], [5, 1, 3, 0], [2, 6, 5, 1], [1, 5, 2, 2]])`

Pass the created matrix data to the method

using the below code.*eigh()*

`eigh(matrix_data)`

This is how to compute the eigenvalues using the method

of Python Scipy.*eigh()*

Read: Scipy Ndimage Rotate

## Scipy Linalg Lu

The Python Scipy has a method

within module *lu()*

to calculate the pivoted Lu decomposition of the matrix.*scipy.linalg*

The syntax is given below.

`scipy.linalg.lu(a, permute_l=True, check_finite=False, overwrite_a=True,)`

Where parameters are:

To decompose the array.*a(array_data):*To do the multiplication*permute_l (boolean):*to overwrite*overwrite_a (boolean):*`a`

.To check if the provided matrix as input has finite numbers.*check_finit(boolean):*

The method returns ,

`p`

(Permutation matrix)**,**

`l`

(Lower triangular)**in case of**

`u`

(Upper triangular)*permute_l equal to false*

and **,**

`pl`

(Permutation L matrix)**in case of**

`u`

(Upper triangular) **of type ndarray.**

`permute_l equal to true`

Let’s understand with an example by following the below steps:

Import the required library using the below python code.

```
import numpy as np
from scipy.linalg import lu
```

Create an array of data using the below code.

`array_data = np.array([[8, 7, 2, 5], [2, 8, 5, 2], [6, 6, 5, 7], [4, 5, 8, 4]])`

Pass the created array of data to the method

using the below code.*lu()*

```
permute_mat,lower_tri,upper_tri = lu(array_data)
print('Permutation matrix',permute_mat)
print('Lower triangular',lower_tri)
print('Upper triangular',upper_tri)
```

Looking at the output, the results are

, *Permutaton matrix*

and *Lower triangular*

.*Upper triangular*

This is how to use the method

matrix.*lu() for Lu decomposition of a *

Read: Scipy Normal Distribution

## Scipy Linalg Svd

The Python Scipy has a method

within module *svd()*

for singular decomposition value.*scipy.linalg*

The syntax is given below.

`scipy.linalg.svd(a, compute_uv=False, full_matrices=False, overwrite_a=True, check_finite=False, lapack_driver='gesdd')`

Where parameters are:

It is matrix for decomposing.*a(array_data):*To calculate v and uh besides s.*compute_uv(boolean):*For true value, the shape of v and uh are (M, M) (N, N) and for false the shape are (M, K) and (K, N).*full_matrices(boolean):*To overwrite*overwrite_a(boolean):*`a`

.To check if the provided matrix as input has finite numbers.*check_finite(boolean):*The more efficient general rectangular approach or divide-and-conquer approach is used.*lapack_driver(gesvd, gesdd):*

The method

returns *svd()*,

`U`

( left singular vectors of Unitary matrix)**and**

`s`

(singular values)**of type ndarray.**

`vh`

(right singular vectors of Unitary matrix)Let’s take an example by following the below steps:

Import the required library using the below python code.

```
from numpy.random import default_rng
from scipy.linalg import svd
```

Generate an array of data using the random generator default_rng using the below code.

```
random_numgen = default_rng()
m, n = 12, 8
array_data = random_numgen.standard_normal((m, n)) + 1.j*random_numgen.standard_normal((m, n))
```

Perform the svd on the array of data using the below code.

```
U, s, Vh = svd(array_data)
print("left singular vectors of Unitary matrix",U.shape)
print("singular values",s)
print("right singular vectors of Unitary matrix",Vh.shape)
```

This is how to use the method

for singular decomposition of the array.*svd()*

Read: Scipy Stats Zscore

## Scipy Linalg Solve

The Python Scipy has a method

within module *solve()*

to deal with problems related to the linear equations such as *scipy.linalg*

which means this equation is solved for the value *ax = b*

of square matrix *x*

.*a*

The syntax is given below.

`scipy.linalg.solve(a, b, overwrite_a=True, lower=True, debug=None, overwrite_b=True, sym_pos=True, assume_a='gen', check_finite=False, transposed=True)`

Where parameters are:

(array_data): To accept the square data as input.*a*- b(array_data): To input the right-hand side of the data.
Whether the relevant array of data is chosen from the lower or upper triangle of a.*lower(bool):*To overwrite a.*overwrite_a(boolean):*To overwrite*overwrite_b(boolean):*

.*b*To check if the provided matrix as input has finite numbers.*check_finite(boolean):*Instead of*sym_post(boolean):*

use the parameter*sym_pos*

because*assume_a = pos*

is depreciated. This parameter considers the provided value of the parameter*sym_pos*

as asymmetric and positive definite.*a*value it should contain is explained in the above parameter.*What*if it is true, then the*transposed (boolean):*`a`

is transposed, such as

.*a*T x = b*

The method `solve`

returns of type ndarray and error that occurred.

`x`

(which is a solution array)Let’s take an example by following the below steps:

Import the required libraries using the below python code.

```
from scipy.linalg import solve
import numpy as np
```

Given the value of x and y, find the value of z, and first, create the array of data for x and y using the below code.

```
x = np.array([[4, 3, 0], [2, -2, 0], [1, 0, 5]])
y = np.array([1, 3, -4])
```

Solve the x and y for z using the below code.

`solve(x,y)`

This is how to use the method

to solve linear equation problems.*solve()*

Read: Scipy Signal

## Scipy Linalg Qr

We will talk about QR decomposition or QR factorization of a matrix. A QR factorization is the decomposition of a matrix, such as ‘A,’ into ‘A=QR,’ where R is an upper-triangular matrix and Q is orthogonal. We factorize the matrix with the Python SciPy method

function.*scipy.linalg.qr()*

The syntax is given below.

`scipy.linalg.qr(a, overwrite_a=True, lwork=None, mode='full', pivoting=True, check_finite=False)`

Where parameters are:

Input the matrix that we want to be decomposed.*a(array_data):*To overwrite*overwrite_a(boolean):*`a`

.To check if the provided matrix as input has finite numbers.*check_finite(boolean):*Size of the work array,*lwork(int):*`lwork >= a.shape[1]`

. If None or -1 is specified, the optimal size is determined.Determines what data will be returned either both Q and R (‘full’, which is the default), only R (‘r’), or both Q and R but computed in economy-size.*mode:*Whether or not pivoting should be included in factorization for rank-revealing qr decomposition. If pivoting, perform the decomposition*pivoting(boolean):*

as described above, but with P chosen so that the diagonal of R is not increasing.*A P = Q R*

The method returns the ,

`Q`

( which is shape as M, M)**and**

`R`

(shape of M, N)**of type ndarray or float or int.**

`P`

(shape of N)Let’s take an example by following the below steps:

Import the required libraries using the below python code.

```
import numpy as np
from scipy.linalg import qr
```

Create an object of a random number generator and generate a sample from a normal distribution using the below code.

```
random_gen = np.random.default_rng()
data = random_gen.standard_normal((7, 5))
data
```

Perform the `qr`

on the data and check the shape using the below code.

```
shape_q, shape_r = qr(data)
print('Shape of q',shape_q.shape)
print('Shape of r',shape_r.shape)
```

This is how to use the method

of Python Scipy for QR decomposition.*qr()*

Read: Scipy Misc + Examples

## Scipy Linalg inverse

Python SciPy contains a method

in a module *inv()*

that determines the inverse of the matrix.*sicpy.linalg*

The syntax is given below.

`scipy.linalg.inv(a, overwrite_a=True, check_finite=False)`

Where parameters are:

Input the matrix that we want to be inverted.*a(array_data):*To overwrite*overwrite_a(boolean):*`a`

.To check if the provided matrix as input has finite numbers.*check_finite(boolean):*

The method

returns the *inv()*.

`inv`

(which inverse of a matrix)Let’s take an example by following the below steps:

Import the required libraries using the below code.

```
from scipy.linalg import inv
import numpy as np
```

Create a matrix and inverse it using the below code.

```
mat = np.array([[2., 1.], [4., 3.]])
inv(mat)
```

This is how to inverse the given matrix using the method

of Python SciPy.*inv()*

Read: Scipy Sparse – Helpful Tutorial

## Scipy Linalg Norm

Python SciPy has a method

that returns matrix norms from 8 different forms.**norm()**

The syntax is given below.

`scipy.linalg.norm(a, axis=None, ord=None, check_finite=True, keepdims=True)`

Where parameters are:

Array of inputs Unless ord is None, the axis must be None and a must be 1-D or 2-D. If both axis and ord are None, the a.ravel 2-norm will be returned.*a(array_data):*If the axis is an integer, it specifies the axis along which the vector norms should be computed. If the axis is a 2-tuple, the axes that hold 2-D matrices are specified, and the matrix norms of these matrices are computed.*axis(2 tuple of int, int):*It is used to provide the norm order.*ord(int, inf):*To check if the provided matrix as input has finite numbers.*check_finite(boolean):*f this is set to True, the axes which are normed over are left in the result as dimensions with size one.*keepdims(boolean):*

The method

returns the norm of the given matrix.*norm()*

Let’s take an example by following the below steps:

Import the required libraries using the below python code.

```
from scipy.linalg import norm
import numpy as np
```

Create an array of data as a matrix whose norm will be computed using the below code.

```
array_data = np.arange(8) - 3.0
array_data
```

Compute the norm of the above-created matrix or array of data using the below code.

`norm(array_data)`

This is how to calculate the norm of the given matrix using the method

of Python SciPy.*norm()*

Read: Scipy Optimize – Helpful Guide

## Scipy Linalg Cholesky

The Python SciPy has a method

that Returns the Cholesky decomposition of a Hermitian positive-definite matrix A, *cholesky()*

.*A=LL or A=UU*

The syntax is given below.

`scipy.linalg.cholesky(a, lower=True, overwrite_a=True, check_finite=False)`

Where parameters are:

To decompose the array.*a(array_data):*Whether the relevant array of data is chosen from the lower or upper triangle of a.*lower(bool):*to overwrite*overwrite_a (boolean):*`a`

.To check if the provided matrix as input has finite numbers.*check_finite(boolean):*

The method

returns *cholesky()*`c`

(The Cholesky factor of an upper- or lower-triangular) of type ndarray.

Let’s take an example by following the below steps:

Import the required libraries using the below python code.

```
from scipy.linalg import cholesky
import numpy as np
```

Create a matrix using the below code.

`m = np.array([[2,-1j],[2j,2]])`

Compute the Cholesky of that matrix using the below code.

`cholesky(m,lower = True)`

This is how to compute the Cholesky of the given matrix using the method

of Python SciPy.*cholesky()*

Also, take a look at some more Scipy Tutorials.

- Python Scipy Special
- Python Scipy Eigenvalues
- Python Scipy Derivative of Array
- Scipy Constants – Multiple Examples
- Scipy Sparse – Helpful Tutorial
- Python Scipy Matrix + Examples

So, in this tutorial, we have learned about the “**Scipy Linalg**” and covered the following topics.

- Scipy Linalg
- Scipy Linalg Eig
- Scipy Linalg Eigh.
- Scipy Linalg Lu
- Scipy Linalg Svd.
- Scipy Linalg Solve
- Scipy Linalg Qr
- Scipy Linalg Inverse
- Scipy Linalg Norm
- Scipy Linalg Cholesky

I am Bijay Kumar, a Microsoft MVP in SharePoint. Apart from SharePoint, I started working on Python, Machine learning, and artificial intelligence for the last 5 years. During this time I got expertise in various Python libraries also like Tkinter, Pandas, NumPy, Turtle, Django, Matplotlib, Tensorflow, Scipy, Scikit-Learn, etc… for various clients in the United States, Canada, the United Kingdom, Australia, New Zealand, etc. Check out my profile.