{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3\n",
      "4\n",
      "3.0\n",
      "4.0\n",
      "(4-1j)\n",
      "12\n",
      "6.3\n",
      "7.4\n",
      "6\n",
      "7\n"
     ]
    }
   ],
   "source": [
    "# Assigning variables\n",
    "x = int(3)\n",
    "y = int(4)\n",
    "\n",
    "print(x)\n",
    "print(y)\n",
    "\n",
    "print(float(x))\n",
    "print(float(y))\n",
    "\n",
    "z = 1 + 3j\n",
    "t = 3 - 4j\n",
    "print(z+t)\n",
    "\n",
    "a = \"1\"\n",
    "b = \"2\"\n",
    "print(a+b)\n",
    "\n",
    "c = 6.3\n",
    "d = 7.4\n",
    "print(c)\n",
    "print(d)\n",
    "print(int(c))\n",
    "print(int(d))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3.0 12 ciao\n",
      "12 3.0 ciao\n"
     ]
    }
   ],
   "source": [
    "# Multiple assignments\n",
    "x, y, z = 3.0, int(12), \"ciao\"\n",
    "print(x,y,z)\n",
    "\n",
    "# Swapping\n",
    "x, y = y, x\n",
    "print(x,y,z)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Incrementing by 1 3.0\n",
      "Another way to increment by 1 4.0\n",
      "Adding  8.0\n",
      "Dividing  4.0\n",
      "Subtracting  1.0\n",
      "Modulo (4%2)  0\n",
      "Modulo (5%2)  1\n"
     ]
    }
   ],
   "source": [
    "# Variable increment by 1\n",
    "x = 2.0\n",
    "x = x+1.\n",
    "print('Incrementing by 1', x)\n",
    "x += 1\n",
    "print('Another way to increment by 1', x)\n",
    "# Adding x to x\n",
    "x += x\n",
    "print('Adding ', x)\n",
    "#Dividing by 2\n",
    "x /= 2.   # Can also write x = x/2.\n",
    "print('Dividing ', x)\n",
    "# Subtracting 3\n",
    "x -= 3.    # Can also write x = x - 3.\n",
    "print('Subtracting ', x)\n",
    "# Modulo operator\n",
    "n = int(4)\n",
    "k = int(2)\n",
    "print('Modulo (4%2) ', n%k)\n",
    "\n",
    "n = int(5)\n",
    "print('Modulo (5%2) ', n%k)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'sin' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "Input \u001b[0;32mIn [4]\u001b[0m, in \u001b[0;36m<cell line: 3>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[38;5;66;03m# Most functions are not built in...\u001b[39;00m\n\u001b[1;32m      2\u001b[0m x \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m2.0\u001b[39m\n\u001b[0;32m----> 3\u001b[0m z \u001b[38;5;241m=\u001b[39m \u001b[43msin\u001b[49m(x)\n\u001b[1;32m      4\u001b[0m \u001b[38;5;28mprint\u001b[39m(z)\n",
      "\u001b[0;31mNameError\u001b[0m: name 'sin' is not defined"
     ]
    }
   ],
   "source": [
    "# Most functions are not built in...\n",
    "x = 2.0\n",
    "z = sin(x)\n",
    "print(z)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9092974268256817\n"
     ]
    }
   ],
   "source": [
    "# ...You need to import packages, like math...\n",
    "import math\n",
    "x = 2.0\n",
    "z = math.sin(x)\n",
    "print(z)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9092974268256817\n"
     ]
    }
   ],
   "source": [
    "#...or numpy\n",
    "import numpy as np\n",
    "y = 2.0\n",
    "t = np.sin(y)\n",
    "print(t)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.0986122886681098\n"
     ]
    }
   ],
   "source": [
    "from math import log #Careful, this \"removes\" log from other packages\n",
    "a = 3.0\n",
    "b = log(a)\n",
    "print(b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1.0, 2.0, 3.0, 4.0)\n",
      "[1.0, 2.0, 3.0, 4.0]\n",
      "[4. 6.]\n",
      "[4.0, 6.0]\n"
     ]
    }
   ],
   "source": [
    "# Tuples, lists and arrays\n",
    "a = (1.,2.)\n",
    "b = (3.,4.)\n",
    "\n",
    "c = [1.,2.]\n",
    "d = [3.,4.]\n",
    "\n",
    "import numpy as np\n",
    "e = np.array(c)\n",
    "f = np.array(d)\n",
    "\n",
    "print(a + b)\n",
    "print(c + d)\n",
    "print(e + f)\n",
    "\n",
    "g = [c[0] + d[0], c[1] + d[1]]\n",
    "print(g)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.0 0.0\n",
      "1.0 0.0\n"
     ]
    }
   ],
   "source": [
    "# Copying x2 into x, for numbers...\n",
    "x = 0.0\n",
    "x2 = x\n",
    "print(x,x2)\n",
    "\n",
    "x = 1.0\n",
    "print(x,x2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0. 0. 0. 0.] [0. 0. 0. 0.]\n",
      " \n",
      "[0. 1. 0. 0.] [0. 1. 0. 0.]\n",
      " \n",
      "[0. 1. 1. 0.] [0. 1. 1. 0.]\n",
      " \n",
      "x1 = \n",
      "[[1. 1. 1. 1.]\n",
      " [1. 1. 1. 1.]]\n",
      "x2 = \n",
      "[[1. 1. 1. 1.]\n",
      " [1. 1. 1. 1.]]\n",
      " \n",
      "x1 = \n",
      "[[1. 1. 1. 1.]\n",
      " [1. 1. 1. 0.]]\n",
      "x2 = \n",
      "[[1. 1. 1. 1.]\n",
      " [1. 1. 1. 1.]]\n",
      " \n"
     ]
    }
   ],
   "source": [
    "#...not the same for arrays!\n",
    "import numpy as np\n",
    "\n",
    "x = np.zeros(4,float)\n",
    "x2 = x\n",
    "print(x,x2)\n",
    "print( ' ')\n",
    "\n",
    "x[1] = 1.0\n",
    "print(x,x2)\n",
    "print(' ')\n",
    "\n",
    "x2[2] = 1.0\n",
    "print(x,x2)\n",
    "print(' ')\n",
    "\n",
    "# If you DO NOT want the array x2 to be modified any time you change x1, then you need to use np.copy\n",
    "x1 = np.ones( [2,4], float)\n",
    "x2 = np.copy(x1)\n",
    "print('x1 = ')\n",
    "print(x1)\n",
    "print('x2 = ')\n",
    "print(x2)\n",
    "print(' ')\n",
    "\n",
    "x1[1,3] = 0.0\n",
    "print('x1 = ')\n",
    "print(x1)\n",
    "print('x2 = ')\n",
    "print(x2)\n",
    "print(' ')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1]\n",
      "[1, 2, (1+3j), 'ciao']\n",
      "[1, 2, (1+3j)]\n",
      "[1, (1+3j)]\n",
      "[1, (1+3j), 6.9]\n",
      "6\n"
     ]
    }
   ],
   "source": [
    "# Some useful operations on lists\n",
    "a = [ ] # Defines empty list\n",
    "\n",
    "a.append(1)\n",
    "print(a)\n",
    "a.append(2)\n",
    "a.append(1+3j)\n",
    "a.append(\"ciao\")\n",
    "print(a)\n",
    "\n",
    "a.pop()\n",
    "print(a)\n",
    "a.pop(1)\n",
    "print(a)\n",
    "a.insert(2,6.9)\n",
    "print(a)\n",
    "\n",
    "b = [1, 2, 3]\n",
    "s = sum(b)\n",
    "print(s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1, [2, (1+3j), 'ciao']]\n",
      "[2, (1+3j), 'ciao']\n",
      "ciao\n",
      "ciao!\n"
     ]
    }
   ],
   "source": [
    "a = [1]\n",
    "b = [2, 1+3j, \"ciao\"]\n",
    "# List inside a list\n",
    "a.append(b)\n",
    "print(a)\n",
    "print(a[1])\n",
    "print(a[1][2])\n",
    "print(str(a[1][2]) + \"!\"  )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[3.7 4.9] \n",
      "\n",
      "[-2.3  7.8] \n",
      "\n",
      "[[1 1 1]\n",
      " [1 1 1]] \n",
      "\n",
      "[[0. 0. 0.]\n",
      " [0. 0. 0.]\n",
      " [0. 0. 0.]] \n",
      "\n"
     ]
    }
   ],
   "source": [
    "# Some useful operations on arrays (defining arrays in this cell and operations in cell below)\n",
    "\n",
    "import numpy as np\n",
    "\n",
    "a = [3.7, 4.9]\n",
    "b = [-2.3, 7.8]\n",
    "a = np.array(a)\n",
    "b = np.array(b)\n",
    "\n",
    "c = np.ones([2,3], int)\n",
    "d = np.zeros([3,3], float)\n",
    "\n",
    "print(a,'\\n')\n",
    "print(b,'\\n')\n",
    "print(c,'\\n')\n",
    "print(d,'\\n')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Array x =  \n",
      " [[ 3.3  1.7 -2.1]\n",
      " [ 7.4 12.6 22.3]\n",
      " [-1.2 -4.2  8.9]] \n",
      "\n",
      "Row 2 =  [-1.2 -4.2  8.9]\n",
      " \n",
      "Row 0 =  [ 3.3  1.7 -2.1]\n",
      " \n",
      "Column 1 =  [ 1.7 12.6 -4.2]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "x = np.array([ [3.3, 1.7, -2.1], [7.4, 12.6, 22.3], [-1.2, -4.2, 8.9] ])\n",
    "print('Array x = ', '\\n', x,'\\n')\n",
    "\n",
    "slice1 = x[2,:]\n",
    "slice2 = x[0,:]\n",
    "column1 = x[:,1]\n",
    "\n",
    "print('Row 2 = ', slice1)\n",
    "print(' ')\n",
    "print('Row 0 = ', slice2)\n",
    "print(' ')\n",
    "print('Column 1 = ', column1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0  2  1]\n",
      " [ 7  1  0]\n",
      " [ 3  5 -4]]\n",
      " \n",
      "Selecting rows\n",
      "[[ 0  2  1]\n",
      " [ 3  5 -4]]\n",
      " \n",
      "Shorthand\n",
      "[[ 0  2  1]\n",
      " [ 3  5 -4]]\n",
      " \n",
      "Selecting columns\n",
      "[[ 2  1]\n",
      " [ 1  0]\n",
      " [ 5 -4]]\n",
      " \n",
      "Swapping columns \n",
      "[[ 1  2  0]\n",
      " [ 0  1  7]\n",
      " [-4  5  3]]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "x = np.array([ [0, 2, 1,], [7, 1, 0], [3, 5, -4] ] )\n",
    "print(x)\n",
    "print(' ')\n",
    "\n",
    "# Selecting rows 0 and 2\n",
    "a = x[ [0,2],:]\n",
    "print('Selecting rows')\n",
    "print(a)\n",
    "print(' ')\n",
    "# Shortand for rows selection\n",
    "a = x[[0,2]]\n",
    "print('Shorthand')\n",
    "print(a)\n",
    "print(' ')\n",
    "\n",
    "# Selecting columns 1 and 2\n",
    "a = x[:,[1,2]]\n",
    "print('Selecting columns')\n",
    "print(a)\n",
    "print(' ')\n",
    "\n",
    "# Swapping columns\n",
    "print('Swapping columns ')\n",
    "x[:,[0,2]]=x[:,[2,0]]\n",
    "print(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-88.00000000000003 \n",
      "\n",
      "[[ 0.36363636  0.06818182 -0.15909091]\n",
      " [ 0.31818182 -0.03409091  0.07954545]\n",
      " [-0.04545455  0.14772727 -0.01136364]]\n",
      "\n",
      " [[ 0.36363636  0.06818182 -0.15909091]\n",
      " [ 0.31818182 -0.03409091  0.07954545]\n",
      " [-0.04545455  0.14772727 -0.01136364]] \n",
      "\n",
      "[[ 0.36363636  0.13636364 -0.        ]\n",
      " [ 0.         -0.03409091  0.55681818]\n",
      " [ 0.18181818  0.73863636 -0.03409091]] \n",
      "\n",
      "[[ 1.00000000e+00  0.00000000e+00  2.77555756e-17]\n",
      " [ 4.16333634e-17  1.00000000e+00  1.04083409e-17]\n",
      " [ 9.71445147e-17 -2.77555756e-17  1.00000000e+00]] \n",
      "\n",
      "[5.  4.1 6.9] \n",
      "\n",
      "15.27 \n",
      "\n",
      "[ 3.   12.    0.27]\n"
     ]
    }
   ],
   "source": [
    "# Matrix determinant\n",
    "detx = np.linalg.det(x)\n",
    "print(detx, '\\n')\n",
    "\n",
    "# Matrix inverse\n",
    "from numpy import linalg as la\n",
    "invx = la.inv(x)\n",
    "print(invx)\n",
    "\n",
    "# Again matrix inverse\n",
    "from numpy.linalg import inv\n",
    "invx = inv(x)\n",
    "print('\\n', invx, '\\n')\n",
    "\n",
    "# * mutiplies arrays element-wise\n",
    "not_unity = x*invx\n",
    "print(not_unity,'\\n')\n",
    "\n",
    "# Matrix multiplication\n",
    "#unity = np.matmul(x,invx)\n",
    "unity = np.dot(x,invx)\n",
    "print(unity, '\\n')\n",
    "\n",
    "# Matrix-vector multiplication\n",
    "y = [1., 2., .3]\n",
    "y = np.array(y)\n",
    "xy = np.dot(x,y)\n",
    "print(xy,'\\n')\n",
    "\n",
    "# Scalar product between vectors\n",
    "v = y\n",
    "w = 3.0*y\n",
    "vw = np.dot(v,w)\n",
    "print(vw,'\\n')\n",
    "\n",
    "vw2 = v*w\n",
    "print(vw2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "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.9.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
