{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "code", "collapsed": false, "input": [ "from __future__ import division\n", "\n", "import numpy as np\n", "import matplotlib.pyplot as pt\n", "\n", "import scipy.sparse as sps" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 49 }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Building a sparse matrix" ] }, { "cell_type": "code", "collapsed": false, "input": [ "data = [5, 6, 7]\n", "rows = [1, 1, 2]\n", "columns = [2, 4, 6]\n", "\n", "A = sps.coo_matrix(\n", " (data, (rows, columns)),\n", " shape=(10, 10), dtype=np.float64)\n", "A" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 50, "text": [ "<10x10 sparse matrix of type ''\n", "\twith 3 stored elements in COOrdinate format>" ] } ], "prompt_number": 50 }, { "cell_type": "code", "collapsed": false, "input": [ "A.todense()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 51, "text": [ "matrix([[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", " [ 0., 0., 5., 0., 6., 0., 0., 0., 0., 0.],\n", " [ 0., 0., 0., 0., 0., 0., 7., 0., 0., 0.],\n", " [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", " [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", " [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", " [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", " [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", " [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", " [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])" ] } ], "prompt_number": 51 }, { "cell_type": "code", "collapsed": false, "input": [ "A.nnz" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 52, "text": [ "3" ] } ], "prompt_number": 52 }, { "cell_type": "code", "collapsed": false, "input": [ "pt.spy(A)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 53, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 53 }, { "cell_type": "markdown", "metadata": {}, "source": [ "For a COO matrix, the juicy attributes are `data`, `row`, and `col`." ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Coordinate format is not the only format. For Compressed Sparse Row, look in `data`, `indptr`, and `indices`." ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 47 }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### How about performance?" ] }, { "cell_type": "code", "collapsed": false, "input": [ "fill_percent = 5\n", "\n", "size = 1000\n", "nentries = size**2 * fill_percent // 100\n", "\n", "data = np.random.randn(nentries)\n", "rows = (np.random.rand(nentries)*size).astype(np.int32)\n", "columns = (np.random.rand(nentries)*size).astype(np.int32)\n", "\n", "B_coo = sps.coo_matrix(\n", " (data, (rows, columns)),\n", " shape=(size, size), dtype=np.float64)\n", "\n", "B_csr = sps.csr_matrix(B_coo)\n", "\n", "B_dense = B_coo.todense()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 43 }, { "cell_type": "code", "collapsed": false, "input": [ "vec = np.random.randn(size)\n", "\n", "from time import time\n", "start = time()\n", "\n", "for i in xrange(200):\n", " B_dense.dot(vec)\n", " \n", "print \"time: %g\" % (time() - start)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "time: 0.282632\n" ] } ], "prompt_number": 48 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }