Simple Arithmetic with NumPy Arrays
  In NumPy, you can easily perform arithmetic operations like addition,
    subtraction, multiplication, and division directly on arrays using
    arithmetic operators (+, -, *, /). However, NumPy also provides dedicated
    functions that extend this functionality.
  These functions can work not only with NumPy arrays but also with other
    array-like objects such as lists and tuples. A key feature of these
    functions is the where parameter, which allows you to perform operations
    conditionally—that is, only on elements that meet a certain condition.
  
1. Addition
  The np.add() function adds corresponding elements from two arrays and
    returns the result as a new array.
Program:
  Adding values from two arrays:
  import numpy as np
  arr1 = np.array([10, 11, 12, 13, 14, 15])
  arr2 = np.array([20, 21, 22, 23, 24, 25])
newarr = np.add(arr1, arr2)
  print(newarr)
Output:
[30 32 34 36 38 40]
2. Subtraction
  The np.subtract() function subtracts the elements of one array from
    another.
Program:
  Subtracting values in arr2 from arr1:
  import numpy as np
  arr1 = np.array([10, 20, 30, 40, 50, 60])
  arr2 = np.array([20, 21, 22, 23, 24, 25])
  newarr = np.subtract(arr1, arr2)
  print(newarr)
Output:
  [-10  -1   8  17  26  35]
3. Multiplication
  The np.multiply() function multiplies corresponding elements from two
    arrays.
Program:
  import numpy as np
  arr1 = np.array([10, 20, 30, 40, 50, 60])
  arr2 = np.array([20, 21, 22, 23, 24, 25])
  newarr = np.multiply(arr1, arr2)
  print(newarr)
Output:
  [ 200  420  660  920 1200 1500]
4. Division
  The np.divide() function divides elements of one array by another.
Program:
  import numpy as np
  arr1 = np.array([10, 20, 30, 40, 50, 60])
  arr2 = np.array([3, 5, 10, 8, 2, 33])
  newarr = np.divide(arr1, arr2)
  print(newarr)
Output:
  [ 3.33333333  4.          3.   
          5.         25.   
          1.81818182]
5. Power
  The np.power() function raises elements of one array to the powers
    specified by another array.
Program:
  import numpy as np
  arr1 = np.array([10, 20, 30, 40, 50, 60])
  arr2 = np.array([3, 5, 6, 8, 2, 33])
  newarr = np.power(arr1, arr2)
  print(newarr)
Output:
  [       1000    3200000  729000000
    6553600000000        2500       
       0]
6. Remainder (Modulo)
  The np.mod() and np.remainder() functions both return the remainder after
    division.
Program:
  import numpy as np
  arr1 = np.array([10, 20, 30, 40, 50, 60])
  arr2 = np.array([3, 7, 9, 8, 2, 33])
newarr = np.mod(arr1, arr2)
  print(newarr)
Output:
[1 6 3 0 0 27]
7. Quotient and Remainder Together
  The np.divmod() function returns both the quotient and the remainder as a
    pair of arrays.
Program:
  import numpy as np
  arr1 = np.array([10, 20, 30, 40, 50, 60])
  arr2 = np.array([3, 7, 9, 8, 2, 33])
  quotient, remainder = np.divmod(arr1, arr2)
  print((quotient, remainder))
Output:
  (array([ 3,  2,  3,  5, 25,  1]), array([1, 6, 3, 0, 0,
    27]))
8. Absolute Values
  To get the absolute value of each element in an array, use np.absolute() or
    np.abs(). However, it’s recommended to use np.absolute() to avoid confusion
    with Python’s built-in abs().
  
Program:
  import numpy as np
  arr = np.array([-1, -2, 1, 2, 3, -4])
newarr = np.absolute(arr)
  print(newarr)
Output:
[1 2 1 2 3 4]
Summary:
  These NumPy arithmetic functions not only simplify operations but also
    provide greater flexibility with conditional execution using the where
    parameter, making them more versatile than using simple operators.
More topic in Numpy

