Skip to content

Instantly share code, notes, and snippets.

@zeehio
Created December 10, 2013 11:23
Show Gist options
  • Save zeehio/7889182 to your computer and use it in GitHub Desktop.
Save zeehio/7889182 to your computer and use it in GitHub Desktop.
Utilitzar tensors i numpy (contracció de tensors i indexat)
Display the source blob
Display the rendered blob
Raw
{
"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