The **main** **difference** between **Numpy** **matrices** and **Numpy** **arrays** is that **Numpy** **matrices** are strictly two-dimensional, while numpy **arrays** (ndarrays) are N-dimensional. Matrix objects are the subclass of the ndarray, so they inherit all the attributes and methods of ndarrays.

The main advantage of numpy matrices is that they provide a convenient notation for matrix multiplication: if x and y are matrices, then **x*y** is their matrix product.

On the other hand, as of Python 3.5, Numpy supports infix matrix multiplication using the **@** operator so that you can achieve the same convenience of the matrix multiplication with ndarrays in Python >= 3.5.

Both matrix objects and ndarrays have **.T** to return the transpose, but the matrix objects also have **.H** for the conjugate transpose and **I** for the inverse.

In contrast, numpy arrays consistently rule that operations are applied element-wise (except for the new @ operator). Thus, if x and y are numpy arrays, then x*y is the array formed by multiplying the components element-wise.

I hope your doubt about the **Numpy** **array** and **Numpy** **Matrix** will be clear.