# NumPy - Arithmetic Functions

The NumPy package contains a number of arithmetic functions which provides all the functionality required for various arithmetic operations. It includes arithmetic functions and functions for handling complex numbers. Below mentioned are the most frequently used arithmetic functions.

FunctionDescription
subtract() Subtract arguments, element-wise.
multiply() Multiply arguments element-wise.
divide() Returns a true division of the inputs, element-wise.
mod() Return element-wise remainder of division.
reciprocal() Return the reciprocal of the argument, element-wise.
power() Returns base raised to the power of exponent.
real() Return the real part of the complex argument.
imag() Return the imaginary part of the complex argument.
conjugate() Return the complex conjugate, element-wise.
angle() Return the angle of the complex argument.

Lets discuss these functions in detail:

## Basic Arithmetic Operations

Basic arithmetic operations can be performed on given arrays, element-wise using add(), subtract(), multiply() and divide() functions. The syntax for using this function is given below:

### Syntax

```numpy.add(x1, x2, out=None)
numpy.subtract(x1, x2, out=None)
numpy.multiply(x1, x2, out=None)
numpy.divide(x1, x2, out=None)
```

### Parameters

 `x1, x2` `Required. `Specify the arrays. If x1.shape != x2.shape, they must be broadcastable to a common shape. `out` `Optional. `Specify a location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned.

### Example:

The example below shows the usage of add() function.

```import numpy as np
Arr1 = np.array([[10,20,30], [40,50,60]])
Arr2 = np.array([[5,10,15]])

print("Arr1 is:")
print(Arr1)

print("\nArr2 is:")
print(Arr2)

#Here, Arr1 and Arr2 are broadcastable
#add elements of Arr1 and Arr2

#subtract elements of Arr2 from Arr1
print("\nsubtract(Arr1, Arr2) returns:")
print(np.subtract(Arr1, Arr2))

#multiply elements of Arr1 with Arr2
print("\nmultiply(Arr1, Arr2) returns:")
print(np.multiply(Arr1, Arr2))

#divide elements of Arr1 by Arr2
print("\ndivide(Arr1, Arr2) returns:")
print(np.divide(Arr1, Arr2))
```

The output of the above code will be:

```Arr1 is:
[[10 20 30]
[40 50 60]]

Arr2 is:
[[ 5 10 15]]

[[15 30 45]
[45 60 75]]

subtract(Arr1, Arr2) returns:
[[ 5 10 15]
[35 40 45]]

multiply(Arr1, Arr2) returns:
[[ 50 200 450]
[200 500 900]]

divide(Arr1, Arr2) returns:
[[2. 2. 2.]
[8. 5. 4.]]
```

## numpy.reciprocal() function

The numpy.reciprocal() function returns the reciprocal of the argument, element-wise.

### Syntax

```numpy.reciprocal(x, out=None, dtype=None)
```

### Parameters

 `x` `Required. `Specify the input array. `out` `Optional. `Specify a location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. `dtype` `Optional. `Specify the desired data type of returned array.

### Example:

The example below shows the usage of reciprocal() function.

```import numpy as np
Arr = np.array([[2,4],[5,10]])

print("Arr is:")
print(Arr)

#reciprocal of Arr
print("\nReciprocal array is:")
print(np.reciprocal(Arr, dtype=float))
```

The output of the above code will be:

```Arr is:
[[ 2  4]
[ 5 10]]

Reciprocal array is:
[[0.5  0.25]
[0.2  0.1 ]]
```

## numpy.mod() function

The numpy.mod() function returns element-wise remainder of division.

### Syntax

```numpy.mod(x1, x2, out=None)
```

### Parameters

 `x1, x2` `Required. `Specify arrays to be divided: x1 as dividend and x2 as divisor. If x1.shape != x2.shape, they must be broadcastable to a common shape. `out` `Optional. `Specify a location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned.

### Example:

The example below shows the usage of mod() function.

```import numpy as np
Arr1 = np.array([[10,20,30],[40,50,60]])
Arr2 = np.array([[6,7,9]])

print("Arr1 is:")
print(Arr1)

print("\nArr2 is:")
print(Arr2)

#Here, Arr1 and Arr2 are broadcastable
#Remainder when Arr1 is divided by Arr2
print("\nmod(Arr1, Arr2) returns:")
print(np.mod(Arr1, Arr2))
```

The output of the above code will be:

```Arr1 is:
[[10 20 30]
[40 50 60]]

Arr2 is:
[[6 7 9]]

mod(Arr1, Arr2) returns:
[[4 6 3]
[4 1 6]]
```

## numpy.power() function

The numpy.power() function is used to calculate first array elements raised to powers from second array, element-wise.

### Syntax

```numpy.power(x, y, out=None)
```

### Parameters

 `x` `Required. `Specify first array (array_like) containing elements as base. `y` `Required. `Specify second array (array_like) containing elements as exponential. If x.shape != y.shape, they must be broadcastable to a common shape (which becomes the shape of the output). `out` `Optional. `Specify a location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned.

### Example:

This example below shows the usage of power() function.

```import numpy as np

base = np.array([5, 6, 7])
exponent = np.array([0, 1, 2])

print("The power of values:")
print(np.power(base, exponent))
```

The output of the above code will be:

```The power of values:
[ 1  6 49]
```

## Handling Complex Numbers

The NumPy package provides following functions which can be used while working with complex numbers.

• real(): Return the real part of the complex argument.
• imag(): Return the imaginary part of the complex argument.
• conjugate(): Return the complex conjugate, element-wise.
• angle(): Return the angle of the complex argument.

### Syntax

```numpy.real(z)
numpy.imag(z)
numpy.conjugate(z, out=None)
numpy.angle(z, deg=False)
```

### Parameters

 `z` `Required. `Specify the input array. `deg` `Optional. `Return angle in degrees if True, radians if False (default). `out` `Optional. `Specify a location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned.

### Example:

The example below shows the usage of above mentioned functions.

```import numpy as np

Arr = np.array([[1+1j,1+2j],
[1+3j,1+4j]])

print("Arr is:")
print(Arr)

#real part of Arr
print("\nReal part of Arr is:")
print(np.real(Arr))

#imaginary part of Arr
print("\nImaginary part of Arr is:")
print(np.imag(Arr))

#conjugate of Arr
print("\nConjuagte of Arr is:")
print(np.conjugate(Arr))

#calculating angle of Arr
print("\nAngle of Arr is:")
print(np.angle(Arr, deg=True))
```

The output of the above code will be:

```Arr is:
[[1.+1.j 1.+2.j]
[1.+3.j 1.+4.j]]

Real part of Arr is:
[[1. 1.]
[1. 1.]]

Imaginary part of Arr is:
[[1. 2.]
[3. 4.]]

Conjugate of Arr is:
[[1.-1.j 1.-2.j]
[1.-3.j 1.-4.j]]

Angle of Arr is:
[[45.         63.43494882]
[71.56505118 75.96375653]]
```

5