#### Python library SciPy

SciPy, which stands for Scientific Python, is an open source, BSD-licensed library (i.e. module) for mathematics, science and engineering. The SciPy library depends on NumPy, which provides a large number of functions that operate on Numpy arrays and are useful for various scientific and engineering applications.

It  is a fully-featured version of Linear Algebra while Numpy contains only a few features. SciPy also offers many user-friendly and efficient numerical practices such as functions for numerical integration and optimization. Most new Data Science features are available in SciPy rather than Numpy.

#### SciPy for Linear Algebra

For performing operations of linear algebra, we will have to import linalg from SciPy. See the example below:

`import numpy as npfrom scipy import linalg## Solving for the set of equations: 5x + 3y = 21 and 2x + 2y = 10# Creating input and solution arrays for this problemA = np.array([[5, 3], [2, 2]])B = np.array([[21], [10]])print(linalg.solve(A, B)) # Solution: x = 3, y = 2`

Output:

`[[3.][2.]]`

#### SciPy for Matrix Operations, Polynomials and Integration

Examples involving matrix operations using linear algebra are given below. We also create polynomials and perform integration using “poly1d” and “integrate” respectively. See the example below.

`import numpy as npfrom scipy import linalgfrom numpy import poly1dfrom scipy import integrate# Sample square matrixmat = np.array([[8,2], [1,4]])print("Sample matrix:")print(mat)# Find determinant of square matrixprint("\nDeterminant: ")print(linalg.det(mat))# Find inverse of square matrixprint("\nInverse: ")print(linalg.inv(mat))# Find singular value decomposition (svd)print("\nSVD: ")print(linalg.svd(mat))# Find LU decompositionprint("\nLUD: ")print(linalg.lu(mat))# Work with polynomial using "poly1d"print("\nPolynomial: ")p = poly1d([5, 3, 2, 7])print(p)val = p(5)print("Value: ", val) # Value of polynomial for x = 5# Work with integration using "integrate"print("\nResult of Integration: ")res = integrate.quad(lambda x: x**2,0,4) # last 2 arguments are lower & upper limitsprint(res)`

Output:

`Sample matrix:[[8 2][1 4]]Determinant: 30.0Inverse: [[ 0.13333333 -0.06666667][-0.03333333 0.26666667]]SVD: (array([[-0.9610057 , -0.27652857],[-0.27652857, 0.9610057 ]]), array([8.52079729, 3.52079729]), array([[-0.9347217 , -0.35538056],[-0.35538056, 0.9347217 ]]))LUD: (array([[1., 0.],[0., 1.]]), array([[1. , 0. ],[0.125, 1. ]]), array([[8. , 2. ],[0. , 3.75]]))Polynomial: 5x³ + 3x² + 2x + 7  # result slightly modified for better understandingValue: 717Result of Integration: (21.333333333333336, 2.368475785867001e-13)`

#### SciPy special functions

SciPy special function includes Cubic Root, Exponential, Log sum Exponential, Lambert, Permutation and Combinations, Gamma, Bessel, hyper-geometric, Kelvin, beta, parabolic cylinder, Relative Error Exponential, etc. See use of some of these functions in the example below. For this, we will have to import special from SciPy.

`from scipy import special# Find cubic root of 125 & 64 using cbrt() functioncb = special.cbrt([125, 64])print(cb)# Define exp10 function and pass value in itexp = special.exp10([1, 5])print(exp)# Find permutations of 6, 4 values using comb(N, k)per = special.perm(6, 4, exact=True)print(per)# Find combinations of 6, 4 values using comb(N, k)com = special.comb(6, 4, exact=True)print(com)# Find Log Sum Exponential Functionres = special.logsumexp(100)print(res)`

Output:

`[5. 4.][1.e+01 1.e+05]36015100.0`