{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "x = [0 1 2 3]\n",
      "x + 5 = [5 6 7 8]\n",
      "x - 5 = [-5 -4 -3 -2]\n",
      "x * 2 = [0 2 4 6]\n",
      "x / 2 = [0.  0.5 1.  1.5]\n",
      "x // 2 = [0 0 1 1]\n",
      "-x =  [ 0 -1 -2 -3]\n",
      "x ** 2 =  [0 1 4 9]\n",
      "x % 2 =  [0 1 0 1]\n",
      "[2 3 4 5]\n"
     ]
    }
   ],
   "source": [
    "# Iam very sorry because I had to copy the problems given below directly from the textbook, because it is a redundant process.\n",
    "# Moreover the concept of numpy library is a never ending process, because there are a ton of different methods and functions.\n",
    "# I think this is more than enough to learn about numpy.\n",
    "import numpy as np\n",
    "x = np.arange(4)\n",
    "print(\"x =\", x)\n",
    "print(\"x + 5 =\", x + 5)\n",
    "print(\"x - 5 =\", x - 5)\n",
    "print(\"x * 2 =\", x * 2)\n",
    "print(\"x / 2 =\", x / 2)\n",
    "print(\"x // 2 =\", x // 2) # floor division\n",
    "print(\"-x = \", -x)\n",
    "print(\"x ** 2 = \", x ** 2)\n",
    "print(\"x % 2 = \", x % 2)\n",
    "print(np.add(x, 2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[2 1 0 1 2]\n",
      "---------------------------\n",
      "[5. 5. 2. 1.]\n"
     ]
    }
   ],
   "source": [
    "# Absolute value\n",
    "x = np.array([-2, -1, 0, 1, 2])\n",
    "print(abs(x))\n",
    "print(\"---------------------------\")\n",
    "x = np.array([3 - 4j, 4 - 3j, 2 + 0j, 0 + 1j])\n",
    "print(np.abs(x))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "---------------------------\n",
      "theta =  [0.         1.57079633 3.14159265]\n",
      "sin(theta) =  [0.0000000e+00 1.0000000e+00 1.2246468e-16]\n",
      "cos(theta) =  [ 1.000000e+00  6.123234e-17 -1.000000e+00]\n",
      "tan(theta) =  [ 0.00000000e+00  1.63312394e+16 -1.22464680e-16]\n",
      "---------------------------\n",
      "x =  [-1, 0, 1]\n",
      "arcsin(x) =  [-1.57079633  0.          1.57079633]\n",
      "arccos(x) =  [3.14159265 1.57079633 0.        ]\n",
      "arctan(x) =  [-0.78539816  0.          0.78539816]\n"
     ]
    }
   ],
   "source": [
    "# Trigonometric functions\n",
    "\n",
    "theta = np.linspace(0, np.pi, 3)\n",
    "print(\"---------------------------\")\n",
    "print(\"theta = \", theta)\n",
    "print(\"sin(theta) = \", np.sin(theta))\n",
    "print(\"cos(theta) = \", np.cos(theta))\n",
    "print(\"tan(theta) = \", np.tan(theta))\n",
    "print(\"---------------------------\")\n",
    "\n",
    "x = [-1, 0, 1]\n",
    "print(\"x = \", x)\n",
    "print(\"arcsin(x) = \", np.arcsin(x))\n",
    "print(\"arccos(x) = \", np.arccos(x))\n",
    "print(\"arctan(x) = \", np.arctan(x))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "x = [1, 2, 3]\n",
      "e^x = [ 2.71828183  7.3890561  20.08553692]\n",
      "2^x = [2. 4. 8.]\n",
      "3^x = [ 3  9 27]\n",
      "---------------------------\n",
      "x = [1, 2, 4, 10]\n",
      "ln(x) = [0.         0.69314718 1.38629436 2.30258509]\n",
      "log2(x) = [0.         1.         2.         3.32192809]\n",
      "log10(x) = [0.         0.30103    0.60205999 1.        ]\n",
      "---------------------------\n",
      "exp(x) - 1 = [0.         0.0010005  0.01005017 0.10517092]\n",
      "log(1 + x) = [0.         0.0009995  0.00995033 0.09531018]\n"
     ]
    }
   ],
   "source": [
    "# Exponents and logarithms\n",
    "x = [1, 2, 3]\n",
    "print(\"x =\", x)\n",
    "print(\"e^x =\", np.exp(x))\n",
    "print(\"2^x =\", np.exp2(x))\n",
    "print(\"3^x =\", np.power(3, x))\n",
    "print(\"---------------------------\")\n",
    "\n",
    "x = [1, 2, 4, 10]\n",
    "print(\"x =\", x)\n",
    "print(\"ln(x) =\", np.log(x))\n",
    "print(\"log2(x) =\", np.log2(x))\n",
    "print(\"log10(x) =\", np.log10(x))\n",
    "print(\"---------------------------\")\n",
    "\n",
    "x = [0, 0.001, 0.01, 0.1]\n",
    "print(\"exp(x) - 1 =\", np.expm1(x))\n",
    "print(\"log(1 + x) =\", np.log1p(x))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "gamma(x) = [1.0000e+00 2.4000e+01 3.6288e+05]\n",
      "ln|gamma(x)| = [ 0.          3.17805383 12.80182748]\n",
      "beta(x, 2) = [0.5        0.03333333 0.00909091]\n",
      "---------------------------\n",
      "erf(x) = [0.         0.32862676 0.67780119 0.84270079]\n",
      "erfc(x) = [1.         0.67137324 0.32219881 0.15729921]\n",
      "erfinv(x) = [0.         0.27246271 0.73286908        inf]\n"
     ]
    }
   ],
   "source": [
    "# Another excellent source for more specialized and obscure ufuncs is the submodule\n",
    "# scipy.special. If you want to compute some obscure mathematical function on\n",
    "# your data, chances are it is implemented in scipy.special.\n",
    "\n",
    "from scipy import special\n",
    "x = [1, 5, 10]\n",
    "print(\"gamma(x) =\", special.gamma(x))\n",
    "print(\"ln|gamma(x)| =\", special.gammaln(x))\n",
    "print(\"beta(x, 2) =\", special.beta(x, 2))\n",
    "print(\"---------------------------\")\n",
    "\n",
    "# Error function (integral of Gaussian)\n",
    "# its complement, and its inverse\n",
    "x = np.array([0, 0.3, 0.7, 1.0])\n",
    "print(\"erf(x) =\", special.erf(x))\n",
    "print(\"erfc(x) =\", special.erfc(x))\n",
    "print(\"erfinv(x) =\", special.erfinv(x))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 0. 10. 20. 30. 40.]\n",
      "---------------------------\n",
      "[ 1.  0.  2.  0.  4.  0.  8.  0. 16.  0.]\n"
     ]
    }
   ],
   "source": [
    "# Advanced Ufunc Features\n",
    "# Specifying output\n",
    "\n",
    "x = np.arange(5)\n",
    "y = np.empty(5)\n",
    "np.multiply(x, 10, out=y)\n",
    "print(y)\n",
    "print(\"---------------------------\")\n",
    "\n",
    "y = np.zeros(10)\n",
    "np.power(2, x, out=y[::2])\n",
    "print(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "15\n",
      "---------------------------\n",
      "120\n",
      "---------------------------\n",
      "[ 1  3  6 10 15]\n",
      "---------------------------\n",
      "[  1   2   6  24 120]\n"
     ]
    }
   ],
   "source": [
    "# Aggregates\n",
    "x = np.arange(1, 6)\n",
    "print(np.add.reduce(x))\n",
    "print(\"---------------------------\")\n",
    "\n",
    "print(np.multiply.reduce(x))\n",
    "print(\"---------------------------\")\n",
    "\n",
    "print(np.add.accumulate(x))\n",
    "print(\"---------------------------\")\n",
    "\n",
    "print(np.multiply.accumulate(x))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
