We can implement a Python Matrix in the form of a **2-d List** or a **2-d Array**. **To perform operations on Python Matrix, we need to import Python NumPy Module.**

Python Matrix is essential in the field of statistics, data processing, image processing, etc.

## Creation of a Python Matrix

Python Matrix can be created using one of the following techniques:

**By using Lists****By using arange() method****By using matrix() method**

### 1. Creation of matrix using Lists

The `numpy.array()`

function can be used to create an array using **lists as input to it**.

**Example:**

```
import numpy
input_arr = numpy.array([[ 10, 20, 30],[ 40, 50, 60]])
print(input_arr)
```

**Output:**

```
[[10 20 30]
[40 50 60]]
```

As seen above, the output represents a 2-D matrix with the given set of inputs in the form of list.

### 2. Creation of matrix using ‘numpy.arange()’ function

The `numpy.arange()`

function along with the list inputs can be used to create a matrix in Python.

**Example:**

```
import numpy
print(numpy.array([numpy.arange(10,15), numpy.arange(15,20)]))
```

**Output:**

```
[[10 11 12 13 14]
[15 16 17 18 19]]
```

### 3. Creation of Matrix using ‘numpy.matrix() function’

The `numpy.matrix()`

function enables us to create a matrix in Python.

**Syntax:**

```
numpy.matrix(input,dtype)
```

**input: The elements input to form a matrix.****dtype: The data type of the corresponding output.**

**Example:**

```
import numpy as p
matA = p.matrix([[10, 20], [30, 40]])
print('MatrixA:\n', matA)
matB = p.matrix('[10,20;30,40]', dtype=p.int32) # Setting the data-type to int
print('\nMatrixB:\n', matB)
```

**Output:**

```
MatrixA:
[[10 20]
[30 40]]
MatrixB:
[[10 20]
[30 40]]
```

## Addition of Matrix in Python

The addition operation on Matrices can be performed in the following ways:

**Traditional method****By using ‘+’ operator**

### 1. Traditional method

In this traditional method, we basically take the input from the user and then perform the addition operation using the **for loops** (to traverse through the elements of the matrix) and **‘+’ operator**.

**Example:**

```
import numpy as p
ar1 = p.matrix([[11, 22], [33, 44]])
ar2 = p.matrix([[55, 66], [77, 88]])
res = p.matrix(p.zeros((2,2)))
print('Matrix ar1 :\n', ar1)
print('\nMatrix ar2 :\n', ar2)
# traditional code
for x in range(ar1.shape[1]):
for y in range(ar2.shape[0]):
res[x, y] = ar1[x, y] + ar2[x, y]
print('\nResult :\n', res)
```

**Note**:`Matrix.shape`

returns the dimensions of a particular matrix.

**Output:**

```
Matrix ar1 :
[[11 22]
[33 44]]
Matrix ar2 :
[[55 66]
[77 88]]
Result :
[[ 66. 88.]
[ 110. 132.]]
```

### 2. Using ‘+’ operator

This method provides better efficiency to the code as it reduces the LOC (lines of code) and thus, optimizes the code.

**Example:**

```
import numpy as p
ar1 = p.matrix([[11, 22], [33, 44]])
ar2 = p.matrix([[55, 66], [77, 88]])
res = p.matrix(p.zeros((2,2)))
print('Matrix ar1 :\n', ar1)
print('\nMatrix ar2 :\n', ar2)
res = ar1 + ar2 # using '+' operator
print('\nResult :\n', res)
```

**Output:**

```
Matrix ar1 :
[[11 22]
[33 44]]
Matrix ar2 :
[[55 66]
[77 88]]
Result :
[[ 66 88]
[110 132]]
```

## Matrix Multiplication in Python

Matrix Multiplication in Python can be provided using the following ways:

**Scalar Product****Matrix Product**

### Scalar Product

In the scalar product, **a scalar/constant value** is multiplied by each element of the matrix.

The** ‘*’ operator **is used to multiply the scalar value with the input matrix elements.

**Example:**

```
import numpy as p
matA = p.matrix([[11, 22], [33, 44]])
print("Matrix A:\n", matA)
print("Scalar Product of Matrix A:\n", matA * 10)
```

**Output:**

```
Matrix A:
[[11 22]
[33 44]]
Scalar Product of Matrix A:
[[110 220]
[330 440]]
```

### Matrix Product

As mentioned above, we can use **the ‘*’ operator only for Scalar multiplication**. In order to go ahead with Matrix multiplication, we need to make use of the `numpy.dot()`

function.

The `numpy.dot()`

function takes **NumPy arrays as parameter** values and performs multiplication according to the basic rules of Matrix Multiplication.

**Example:**

```
import numpy as p
matA = p.matrix([[11, 22], [33, 44]])
matB = p.matrix([[2,2], [2,2]])
print("Matrix A:\n", matA)
print("Matrix B:\n", matB)
print("Dot Product of Matrix A and Matrix B:\n", p.dot(matA, matB))
```

**Output:**

```
Matrix A:
[[11 22]
[33 44]]
Matrix B:
[[2 2]
[2 2]]
Dot Product of Matrix A and Matrix B:
[[ 66 66]
[154 154]]
```

## Subtraction of Python Matrix

The **‘-‘ operator** is used to perform Subtraction on Python Matrix.

**Example:**

```
import numpy as p
matA = p.matrix([[11, 22], [33, 44]])
matB = p.matrix([[2,2], [2,2]])
print("Matrix A:\n", matA)
print("Matrix B:\n", matB)
print("Subtraction of Matrix A and Matrix B:\n",(matA - matB))
```

**Output:**

```
Matrix A:
[[11 22]
[33 44]]
Matrix B:
[[2 2]
[2 2]]
Subtraction of Matrix A and Matrix B:
[[ 9 20]
[31 42]]
```

## Division of Python Matrix

**Scalar Division** can be performed on the elements of the Matrix in Python using the **‘/’ operator**.

The ‘/’ operator divides each element of the Matrix with a scalar/constant value.

**Example**:

```
import numpy as p
matB = p.matrix([[2,2], [2,2]])
print("Matrix B:\n", matB)
print("Matrix B after Scalar Division operation:\n",(matB/2))
```

**Output:**

```
Matrix B:
[[2 2]
[2 2]]
Matrix B after Scalar Division operation:
[[ 1. 1.]
[ 1. 1.]]
```

## Transpose of a Python Matrix

Transpose of a matrix basically involves the **flipping of matrix over the corresponding diagonals** i.e. it exchanges the rows and the columns of the input matrix. The rows become the columns and vice-versa.

For example: Let’s consider a matrix A with dimensions 3×2 i.e 3 rows and 2 columns. After performing transpose operation, the dimensions of the matrix A would be 2×3 i.e 2 rows and 3 columns.

`Matrix.T`

basically performs the transpose of the input matrix and produces a **new matrix** as a result of the transpose operation.

**Example:**

```
import numpy
matA = numpy.array([numpy.arange(10,15), numpy.arange(15,20)])
print("Original Matrix A:\n")
print(matA)
print('\nDimensions of the original MatrixA: ',matA.shape)
print("\nTranspose of Matrix A:\n ")
res = matA.T
print(res)
print('\nDimensions of the Matrix A after performing the Transpose Operation: ',res.shape)
```

**Output:**

```
Original Matrix A:
[[10 11 12 13 14]
[15 16 17 18 19]]
Dimensions of the original MatrixA: (2, 5)
Transpose of Matrix A:
[[10 15]
[11 16]
[12 17]
[13 18]
[14 19]]
Dimensions of the Matrix A after performing the Transpose Operation: (5, 2)
```

In the above snippet of code, I have created a matrix of dimensions 2×5 i.e. 2 rows and 5 columns.

After performing the transpose operation, the dimensions of the resultant matrix are 5×2 i.e. 5 rows and 2 columns.

## Exponent of a Python Matrix

The exponent on a Matrix is calculated **element-wise** i.e. exponent of every element is calculated by raising the element to the power of an input scalar/constant value.

**Example:**

```
import numpy
matA = numpy.array([numpy.arange(0,2), numpy.arange(2,4)])
print("Original Matrix A:\n")
print(matA)
print("Exponent of the input matrix:\n")
print(matA ** 2) # finding the exponent of every element of the matrix
```

**Output:**

```
Original Matrix A:
[[0 1]
[2 3]]
Exponent of the input matrix:
[[0 1]
[4 9]]
```

In the above code snippet, we have found out the exponent of every element of the input matrix by raising it to the power of 2.

## Matrix Multiplication Operation using NumPy Methods

The following techniques can be used to perform NumPy Matrix multiplication:

**Using the multiply() method****Using the matmul() method****Using the dot() method**– Already covered in this article

### Method 1: Using the multiply() method

The `numpy.multiply()`

method performs element-wise multiplication on an input matrix.

**Example:**

```
import numpy as p
matA = p.matrix([[10, 20], [30, 40]])
print('MatrixA:\n', matA)
matB = p.matrix('[10,20;30,40]', dtype=p.int32) # Setting the data-type to int
print('\nMatrixB:\n', matB)
print("Matrix multplication using numpy.matrix() method")
res = p.multiply(matA,matB)
print(res)
```

**Output:**

```
MatrixA:
[[10 20]
[30 40]]
MatrixB:
[[10 20]
[30 40]]
Matrix multplication using numpy.matrix() method
[[ 100 400]
[ 900 1600]]
```

### Method 2: Using the matmul() method

The `numpy.matmul()`

method performs the matrix product on the input matrices.

**Example:**

```
import numpy as p
matA = p.matrix([[10, 20], [30, 40]])
print('MatrixA:\n', matA)
matB = p.matrix('[10,20;30,40]', dtype=p.int32) # Setting the data-type to int
print('\nMatrixB:\n', matB)
print("Matrix multplication using numpy.matmul() method")
res = p.matmul(matA,matB)
print(res)
```

**Output:**

```
MatrixA:
[[10 20]
[30 40]]
MatrixB:
[[10 20]
[30 40]]
Matrix multplication using numpy.matmul() method
[[ 700 1000]
[1500 2200]]
```

I would strongly recommend all the readers to go through the below tutorial to have a thorough understanding of NumPy Matrix Multiplication: NumPy Matrix Multiplication

## NumPy Matrix Transpose

The `numpy.transpose()`

function performs the transpose on the input matrix and results in a new matrix.

**Example:**

```
import numpy
matA = numpy.array([numpy.arange(10,15), numpy.arange(15,20)])
print("Original Matrix A:\n")
print(matA)
print('\nDimensions of the original MatrixA: ',matA.shape)
print("\nTranspose of Matrix A:\n ")
res = matA.transpose()
print(res)
print('\nDimensions of the Matrix A after performing the Transpose Operation: ',res.shape)
```

**Output:**

```
Original Matrix A:
[[10 11 12 13 14]
[15 16 17 18 19]]
Dimensions of the original MatrixA: (2, 5)
Transpose of Matrix A:
[[10 15]
[11 16]
[12 17]
[13 18]
[14 19]]
Dimensions of the Matrix A after performing the Transpose Operation: (5, 2)
```

Recommended read: NumPy Matrix transpose() function

## Conclusion

Thus, in this article, we have understood the operations performed on Python Matrix and also had a look at the NumPy Matrix operations.

## References

- Python Matrix
- NumPy Documentation
- Python NumPy