Created
December 10, 2013 11:23
-
-
Save zeehio/7889182 to your computer and use it in GitHub Desktop.
Utilitzar tensors i numpy (contracció de tensors i indexat)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"metadata": { | |
"name": "" | |
}, | |
"nbformat": 3, | |
"nbformat_minor": 0, | |
"worksheets": [ | |
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Definici\u00f3 i manipulaci\u00f3 (slicing) de tensors en numpy:\n", | |
"\n", | |
"Nota que a python els \u00edndex comencen a zero i els intervals \"0:2\" s'interpreten [0,2)." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"import numpy as np\n", | |
"\n", | |
"print \"Definim un vector unidimensional:\"\n", | |
"A = np.array(range(0,24))\n", | |
"print A\n", | |
"print \"El convertim en un tensor 3x4x2\"\n", | |
"A.shape = (3,4,2)\n", | |
"print A\n", | |
"print \"Accedim a la component A[0,2,1]\"\n", | |
"print A[0,2,1]\n", | |
"print \"Accedim a la component A[0,:,:]\"\n", | |
"print A[0,:,:]\n", | |
"print \"Volem agafar la component i=1, les components j={0,1} i la component k=0\"\n", | |
"print A[1,0:2,0]" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"Definim un vector unidimensional:\n", | |
"[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]\n", | |
"El convertim en un tensor 3x4x2\n", | |
"[[[ 0 1]\n", | |
" [ 2 3]\n", | |
" [ 4 5]\n", | |
" [ 6 7]]\n", | |
"\n", | |
" [[ 8 9]\n", | |
" [10 11]\n", | |
" [12 13]\n", | |
" [14 15]]\n", | |
"\n", | |
" [[16 17]\n", | |
" [18 19]\n", | |
" [20 21]\n", | |
" [22 23]]]\n", | |
"Accedim a la component A[0,2,1]\n", | |
"5\n", | |
"Accedim a la component A[0,:,:]\n", | |
"[[0 1]\n", | |
" [2 3]\n", | |
" [4 5]\n", | |
" [6 7]]\n", | |
"Volem agafar la component i=1, les components j={0,1} i la component k=0\n", | |
"[ 8 10]\n" | |
] | |
} | |
], | |
"prompt_number": 27 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Una contracci\u00f3 tensorial senzilla:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"B = np.array([[4,7,2],[2,3,4],[6,4,2], [5,6,7],[1,2,4]])\n", | |
"print \"B \u00e9s una matriu 5x3:\"\n", | |
"print B\n", | |
"print \"Segur? Mida de B:\"\n", | |
"print B.shape\n", | |
"print \"Clar que s\u00ed\"\n", | |
"print \"Fem la contracci\u00f3 dels tensors A,B. Contraurem el primer \u00edndex de A amb el segon \u00edndex de B\"\n", | |
"C = np.tensordot(A, B, [0,1])\n", | |
"print C\n", | |
"print \"Dimensions de C:\"\n", | |
"print C.shape" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"B \u00e9s una matriu 5x3:\n", | |
"[[4 7 2]\n", | |
" [2 3 4]\n", | |
" [6 4 2]\n", | |
" [5 6 7]\n", | |
" [1 2 4]]\n", | |
"Segur? Mida de B:\n", | |
"(5, 3)\n", | |
"Clar que s\u00ed\n", | |
"Fem la contracci\u00f3 dels tensors A,B. Contraurem el primer \u00edndex de A amb el segon \u00edndex de B\n", | |
"[[[ 88 88 64 160 80]\n", | |
" [101 97 76 178 87]]\n", | |
"\n", | |
" [[114 106 88 196 94]\n", | |
" [127 115 100 214 101]]\n", | |
"\n", | |
" [[140 124 112 232 108]\n", | |
" [153 133 124 250 115]]\n", | |
"\n", | |
" [[166 142 136 268 122]\n", | |
" [179 151 148 286 129]]]\n", | |
"Dimensions de C:\n", | |
"(4, 2, 5)\n" | |
] | |
} | |
], | |
"prompt_number": 32 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Podem contraure m\u00e9s d'un \u00edndex simult\u00e0niament:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"print \"Ara farem servir el tensor C 4x2x5 i el contraurem amb el tensor A 3x4x2.\"\n", | |
"print \"Contraurem el primer \u00edndex de C amb el segon de A i el segon \u00edndex de C amb el tercer de A\"\n", | |
"D = np.tensordot(C,A,[ [0,1],[1,2]]) # els \u00edndex els comencem a comptar des de zero!\n", | |
"print \"Resultat:\"\n", | |
"print D\n", | |
"print \"Dimensions:\"\n", | |
"print D.shape" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"Ara farem servir el tensor C 4x2x5 i el contraurem amb el tensor A 3x4x2.\n", | |
"Contraurem el primer \u00edndex de C amb el segon de A i el segon \u00edndex de C amb el tercer de A\n", | |
"Resultat:\n", | |
"[[ 4284 12828 21372]\n", | |
" [ 3724 11372 19020]\n", | |
" [ 3472 10256 17040]\n", | |
" [ 7000 21272 35544]\n", | |
" [ 3220 9908 16596]]\n", | |
"Dimensions:\n", | |
"(5, 3)\n" | |
] | |
} | |
], | |
"prompt_number": 40 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Definir amb un bucle for un tensor numpy \u00e9s possible:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"print \"Un apunt: la funcio range(10) torna una llista amb els n\u00fameros enters en l'interval [0,10):\"\n", | |
"print range(10)\n", | |
"print \"La farem servir per iterar pel nostre tensor\"\n", | |
"dimensions_tensor = (3,2,4)\n", | |
"print \"Inicialitzem un tensor de la mida que volem a zeros:\"\n", | |
"tensor = np.zeros(dimensions_tensor) # Tot el tensor s\u00f3n zeros\n", | |
"print tensor\n", | |
"print \"Les dimensions del tensor\", tensor.shape\n", | |
"print \"Li donem valors a voluntat:\"\n", | |
"for i in range(dimensions_tensor[0]):\n", | |
" for j in range(dimensions_tensor[1]):\n", | |
" for k in range(dimensions_tensor[2]):\n", | |
" if i==j and k==1:\n", | |
" tensor[i,j,k] = 1\n", | |
" elif i==k and j==0:\n", | |
" tensor[i,j,k] = 2\n", | |
" else:\n", | |
" tensor[i,j,k] = 3\n", | |
"print tensor" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"Un apunt: la funcio range(10) torna una llista amb els n\u00fameros enters en l'interval [0,10):\n", | |
"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", | |
"La farem servir per iterar pel nostre tensor\n", | |
"Inicialitzem un tensor de la mida que volem a zeros:\n", | |
"[[[ 0. 0. 0. 0.]\n", | |
" [ 0. 0. 0. 0.]]\n", | |
"\n", | |
" [[ 0. 0. 0. 0.]\n", | |
" [ 0. 0. 0. 0.]]\n", | |
"\n", | |
" [[ 0. 0. 0. 0.]\n", | |
" [ 0. 0. 0. 0.]]]\n", | |
"Les dimensions del tensor (3, 2, 4)\n", | |
"Li donem valors a voluntat:\n", | |
"[[[ 2. 1. 3. 3.]\n", | |
" [ 3. 3. 3. 3.]]\n", | |
"\n", | |
" [[ 3. 2. 3. 3.]\n", | |
" [ 3. 1. 3. 3.]]\n", | |
"\n", | |
" [[ 3. 3. 2. 3.]\n", | |
" [ 3. 3. 3. 3.]]]\n" | |
] | |
} | |
], | |
"prompt_number": 50 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [] | |
} | |
], | |
"metadata": {} | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment