{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Fyrirlestur 8\n",
    "\n",
    "Dagsetning: 25. febrúar\n",
    "\n",
    "Python uppsetning"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Fylki eru af taginu `ndarray` alveg eins og vigrar"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[  0.    1.   -2.    0.2]\n",
      " [  1.4   0.   -1.   10. ]\n",
      " [  3.1  -1.    4.    5. ]]\n",
      "<class 'numpy.ndarray'>\n",
      "A.size =  12\n",
      "A.ndim =  2\n",
      "A.shape =  (3, 4)\n"
     ]
    }
   ],
   "source": [
    "A = np.array([[0,1,-2,0.2], [1.4,0,-1,10],[3.1, -1,4,5]]) # listi af listum\n",
    "print(A)\n",
    "print(type(A))\n",
    "print('A.size = ', A.size) # fjöldi staka í fylkinu\n",
    "print('A.ndim = ',A.ndim) # fjöldi vídda, 2 fyrir fylki\n",
    "print('A.shape = ',A.shape) # fjöldi raða, fjöldi dálka"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Tilvísun í stök virkar eins og fyrir vigra, byrjum að telja í 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.4\n",
      "1.4\n",
      "1.4\n"
     ]
    }
   ],
   "source": [
    "print(A[1][0]) # getum notað A[0][0] eins og í java\n",
    "print(A[1,0])  # getum líka vísað í stök með kommum á milli (tuple)\n",
    "v = (1,0)\n",
    "print(A[v])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Tilvísanir í dálka og raðir"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 0.   1.  -2.   0.2]\n",
      "(4,)\n",
      "1\n"
     ]
    }
   ],
   "source": [
    "print(A[0]) # A[0] gefur fyrstu röð, línuvigur\n",
    "u = A[0]\n",
    "print(u.shape)\n",
    "print(u.ndim) # u er hérna n-vigur, en við gerum greinarmun í stærðfræði"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 0.   1.4  3.1]\n",
      "(3,)\n",
      "1\n"
     ]
    }
   ],
   "source": [
    "print(A[:,0]) # A[:,0] gefur fyrsta dálk\n",
    "v = A[:,0]\n",
    "print(v.shape)\n",
    "print(v.ndim) # v er venjulegur vigur"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Hlutfylki/blokkir"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0.   1. ]\n",
      " [ 1.4  0. ]]\n"
     ]
    }
   ],
   "source": [
    "print(A[0:2,0:2]) # fyrstu tveir dálkar og tvær raðir"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## Fylki úr dálkum\n",
    "Ef við höfum lista af vigrum þá getum við búið til fylki úr þeim með `column_stack` fallinu sem dálka, eða `vstack` með röðum"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "B =  [[ 0.  1.  0.]\n",
      " [ 0.  1.  0.]\n",
      " [ 0.  1.  0.]\n",
      " [ 0.  1.  0.]\n",
      " [ 0.  1.  0.]]\n",
      "C =  [[ 0.  0.  0.  0.  0.]\n",
      " [ 1.  1.  1.  1.  1.]\n",
      " [ 0.  0.  0.  0.  0.]]\n"
     ]
    }
   ],
   "source": [
    "v1 = np.zeros(5)\n",
    "v2 = np.ones(5)\n",
    "B = np.column_stack([v1,v2,v1])\n",
    "print('B = ',B)\n",
    "C = np.vstack([v1,v2,v1])\n",
    "print('C = ',C)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Sérstök fylki\n",
    "\n",
    "Núllfylkið og einingafylkið fást með föllunum `zeros` og `eye` (borið fram \"æ\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Z =  [[ 0.  0.  0.  0.]\n",
      " [ 0.  0.  0.  0.]\n",
      " [ 0.  0.  0.  0.]]\n",
      "[[ 1.  0.  0.  0.  0.]\n",
      " [ 0.  1.  0.  0.  0.]\n",
      " [ 0.  0.  1.  0.  0.]\n",
      " [ 0.  0.  0.  1.  0.]\n",
      " [ 0.  0.  0.  0.  1.]]\n"
     ]
    }
   ],
   "source": [
    "Z = np.zeros((3,4)) # (3,4) þarf að vera í tuple, np.zeros(3,4) virkar ekki\n",
    "print('Z = ',Z)\n",
    "I = np.eye(5) # I er ferningslaga\n",
    "print(I)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Hornalínufylki fást með `diag` fallinu"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1 0 0]\n",
      " [0 2 0]\n",
      " [0 0 3]]\n",
      "[[ 0.97678335  0.          0.          0.          0.        ]\n",
      " [ 0.          0.967279    0.          0.          0.        ]\n",
      " [ 0.          0.          0.37918655  0.          0.        ]\n",
      " [ 0.          0.          0.          0.60356313  0.        ]\n",
      " [ 0.          0.          0.          0.          0.87978343]]\n"
     ]
    }
   ],
   "source": [
    "C = np.diag([1,2,3]) # listi af tölum\n",
    "print(C)\n",
    "C = np.diag(np.random.random(5)) # eða numpy vigur\n",
    "print(C)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Bylt fylki\n",
    "\n",
    "fæst með `transpose` fallinu"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "A = \n",
      " [[  0.    1.   -2.    0.2]\n",
      " [  1.4   0.   -1.   10. ]\n",
      " [  3.1  -1.    4.    5. ]]\n",
      "A^T = \n",
      " [[  0.    1.4   3.1]\n",
      " [  1.    0.   -1. ]\n",
      " [ -2.   -1.    4. ]\n",
      " [  0.2  10.    5. ]]\n"
     ]
    }
   ],
   "source": [
    "print('A = \\n',A)\n",
    "AT = np.transpose(A) # líka hægt að nota A.T\n",
    "print('A^T = \\n',AT)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Samlagning og margföldun\n",
    "\n",
    "Við notum venjulega virkja, `+` og `*`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "A+B =  [[  0.    3.   -1.    5.2]\n",
      " [  2.4   0.   -5.   12. ]\n",
      " [  4.1   4.    6.    5. ]]\n",
      "3*A =  [[  0.    3.   -6.    0.6]\n",
      " [  4.2   0.   -3.   30. ]\n",
      " [  9.3  -3.   12.   15. ]]\n"
     ]
    }
   ],
   "source": [
    "B = np.array([[0,2,1,5],[1,0,-4,2],[1,5,2,0.0]])\n",
    "print('A+B = ',A+B)\n",
    "print('3*A = ',3*A)\n",
    "#A + np.transpose(B) ## skilar villu, stærðirnar passa ekki"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "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.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
