blob: feec8543e885b440dc4a6151fb490b42d64e2340 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta content="IE=edge" http-equiv="X-UA-Compatible"/>
<meta content="width=device-width, initial-scale=1" name="viewport"/>
<title>CSRNDArray - NDArray in Compressed Sparse Row Storage Format — mxnet documentation</title>
<link crossorigin="anonymous" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" rel="stylesheet"/>
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css" rel="stylesheet"/>
<link href="../../_static/basic.css" rel="stylesheet" type="text/css">
<link href="../../_static/pygments.css" rel="stylesheet" type="text/css">
<link href="../../_static/mxnet.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../../',
VERSION: '',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt'
};
</script>
<script src="https://code.jquery.com/jquery-1.11.1.min.js" type="text/javascript"></script>
<script src="../../_static/underscore.js" type="text/javascript"></script>
<script src="../../_static/searchtools_custom.js" type="text/javascript"></script>
<script src="../../_static/doctools.js" type="text/javascript"></script>
<script src="../../_static/selectlang.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"></script>
<script type="text/javascript"> jQuery(function() { Search.loadIndex("/searchindex.js"); Search.init();}); </script>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new
Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-96378503-1', 'auto');
ga('send', 'pageview');
</script>
<!-- -->
<!-- <script type="text/javascript" src="../../_static/jquery.js"></script> -->
<!-- -->
<!-- <script type="text/javascript" src="../../_static/underscore.js"></script> -->
<!-- -->
<!-- <script type="text/javascript" src="../../_static/doctools.js"></script> -->
<!-- -->
<!-- <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> -->
<!-- -->
<link href="../../genindex.html" rel="index" title="Index">
<link href="../../search.html" rel="search" title="Search"/>
<link href="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/mxnet-icon.png" rel="icon" type="image/png"/>
</link></link></link></head>
<body background="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/mxnet-background-compressed.jpeg" role="document">
<div class="content-block"><div class="navbar navbar-fixed-top">
<div class="container" id="navContainer">
<div class="innder" id="header-inner">
<h1 id="logo-wrap">
<a href="../../" id="logo"><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/mxnet_logo.png"/></a>
</h1>
<nav class="nav-bar" id="main-nav">
<a class="main-nav-link" href="../../install/index.html">Install</a>
<span id="dropdown-menu-position-anchor">
<a aria-expanded="true" aria-haspopup="true" class="main-nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button">Gluon <span class="caret"></span></a>
<ul class="dropdown-menu navbar-menu" id="package-dropdown-menu">
<li><a class="main-nav-link" href="../../gluon/index.html">About</a></li>
<li><a class="main-nav-link" href="http://gluon.mxnet.io">Tutorials</a></li>
</ul>
</span>
<span id="dropdown-menu-position-anchor">
<a aria-expanded="true" aria-haspopup="true" class="main-nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button">API <span class="caret"></span></a>
<ul class="dropdown-menu navbar-menu" id="package-dropdown-menu">
<li><a class="main-nav-link" href="../../api/python/index.html">Python</a></li>
<li><a class="main-nav-link" href="../../api/scala/index.html">Scala</a></li>
<li><a class="main-nav-link" href="../../api/r/index.html">R</a></li>
<li><a class="main-nav-link" href="../../api/julia/index.html">Julia</a></li>
<li><a class="main-nav-link" href="../../api/c++/index.html">C++</a></li>
<li><a class="main-nav-link" href="../../api/perl/index.html">Perl</a></li>
</ul>
</span>
<span id="dropdown-menu-position-anchor-docs">
<a aria-expanded="true" aria-haspopup="true" class="main-nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button">Docs <span class="caret"></span></a>
<ul class="dropdown-menu navbar-menu" id="package-dropdown-menu-docs">
<li><a class="main-nav-link" href="../../tutorials/index.html">Tutorials</a>
<li><a class="main-nav-link" href="../../faq/index.html">FAQ</a></li>
<li><a class="main-nav-link" href="../../architecture/index.html">Architecture</a></li>
<li><a class="main-nav-link" href="https://github.com/apache/incubator-mxnet/tree/master/example">Examples</a></li>
<li><a class="main-nav-link" href="../../api/python/gluon/model_zoo.html">Gluon Model Zoo</a></li>
</li></ul>
</span>
<a class="main-nav-link" href="https://github.com/dmlc/mxnet">Github</a>
<span id="dropdown-menu-position-anchor-community">
<a aria-expanded="true" aria-haspopup="true" class="main-nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button">Community <span class="caret"></span></a>
<ul class="dropdown-menu navbar-menu" id="package-dropdown-menu-community">
<li><a class="main-nav-link" href="../../community/index.html">Community</a></li>
<li><a class="main-nav-link" href="../../community/contribute.html">Contribute</a></li>
<li><a class="main-nav-link" href="../../community/powered_by.html">Powered By</a></li>
<li><a class="main-nav-link" href="http://discuss.mxnet.io">Discuss</a></li>
</ul>
</span>
<span id="dropdown-menu-position-anchor-version" style="position: relative"><a href="#" class="main-nav-link dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="true">Versions(master)<span class="caret"></span></a><ul id="package-dropdown-menu" class="dropdown-menu"><li><a class="main-nav-link" href=http://mxnet.incubator.apache.org/>1.1.0</a></li><li><a class="main-nav-link" href=http://mxnet.incubator.apache.org/versions/1.0.0/index.html>1.0.0</a></li><li><a class="main-nav-link" href=http://mxnet.incubator.apache.org/versions/0.12.1/index.html>0.12.1</a></li><li><a class="main-nav-link" href=http://mxnet.incubator.apache.org/versions/0.12.0/index.html>0.12.0</a></li><li><a class="main-nav-link" href=http://mxnet.incubator.apache.org/versions/0.11.0/index.html>0.11.0</a></li><li><a class="main-nav-link" href=http://mxnet.incubator.apache.org/versions/master/index.html>master</a></li></ul></span></nav>
<script> function getRootPath(){ return "../../" } </script>
<div class="burgerIcon dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button"></a>
<ul class="dropdown-menu" id="burgerMenu">
<li><a href="../../install/index.html">Install</a></li>
<li><a class="main-nav-link" href="../../tutorials/index.html">Tutorials</a></li>
<li class="dropdown-submenu">
<a href="#" tabindex="-1">Community</a>
<ul class="dropdown-menu">
<li><a href="../../community/index.html" tabindex="-1">Community</a></li>
<li><a href="../../community/contribute.html" tabindex="-1">Contribute</a></li>
<li><a href="../../community/powered_by.html" tabindex="-1">Powered By</a></li>
</ul>
</li>
<li class="dropdown-submenu">
<a href="#" tabindex="-1">API</a>
<ul class="dropdown-menu">
<li><a href="../../api/python/index.html" tabindex="-1">Python</a>
</li>
<li><a href="../../api/scala/index.html" tabindex="-1">Scala</a>
</li>
<li><a href="../../api/r/index.html" tabindex="-1">R</a>
</li>
<li><a href="../../api/julia/index.html" tabindex="-1">Julia</a>
</li>
<li><a href="../../api/c++/index.html" tabindex="-1">C++</a>
</li>
<li><a href="../../api/perl/index.html" tabindex="-1">Perl</a>
</li>
</ul>
</li>
<li class="dropdown-submenu">
<a href="#" tabindex="-1">Docs</a>
<ul class="dropdown-menu">
<li><a href="../../tutorials/index.html" tabindex="-1">Tutorials</a></li>
<li><a href="../../faq/index.html" tabindex="-1">FAQ</a></li>
<li><a href="../../architecture/index.html" tabindex="-1">Architecture</a></li>
<li><a href="https://github.com/apache/incubator-mxnet/tree/master/example" tabindex="-1">Examples</a></li>
<li><a href="../../api/python/gluon/model_zoo.html" tabindex="-1">Gluon Model Zoo</a></li>
</ul>
</li>
<li><a href="../../architecture/index.html">Architecture</a></li>
<li><a class="main-nav-link" href="https://github.com/dmlc/mxnet">Github</a></li>
<li id="dropdown-menu-position-anchor-version-mobile" class="dropdown-submenu" style="position: relative"><a href="#" tabindex="-1">Versions(master)</a><ul class="dropdown-menu"><li><a tabindex="-1" href=http://mxnet.incubator.apache.org/>1.1.0</a></li><li><a tabindex="-1" href=http://mxnet.incubator.apache.org/versions/1.0.0/index.html>1.0.0</a></li><li><a tabindex="-1" href=http://mxnet.incubator.apache.org/versions/0.12.1/index.html>0.12.1</a></li><li><a tabindex="-1" href=http://mxnet.incubator.apache.org/versions/0.12.0/index.html>0.12.0</a></li><li><a tabindex="-1" href=http://mxnet.incubator.apache.org/versions/0.11.0/index.html>0.11.0</a></li><li><a tabindex="-1" href=http://mxnet.incubator.apache.org/versions/master/index.html>master</a></li></ul></li></ul>
</div>
<div class="plusIcon dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button"><span aria-hidden="true" class="glyphicon glyphicon-plus"></span></a>
<ul class="dropdown-menu dropdown-menu-right" id="plusMenu"></ul>
</div>
<div id="search-input-wrap">
<form action="../../search.html" autocomplete="off" class="" method="get" role="search">
<div class="form-group inner-addon left-addon">
<i class="glyphicon glyphicon-search"></i>
<input class="form-control" name="q" placeholder="Search" type="text"/>
</div>
<input name="check_keywords" type="hidden" value="yes">
<input name="area" type="hidden" value="default"/>
</input></form>
<div id="search-preview"></div>
</div>
<div id="searchIcon">
<span aria-hidden="true" class="glyphicon glyphicon-search"></span>
</div>
<!-- <div id="lang-select-wrap"> -->
<!-- <label id="lang-select-label"> -->
<!-- <\!-- <i class="fa fa-globe"></i> -\-> -->
<!-- <span></span> -->
<!-- </label> -->
<!-- <select id="lang-select"> -->
<!-- <option value="en">Eng</option> -->
<!-- <option value="zh">中文</option> -->
<!-- </select> -->
<!-- </div> -->
<!-- <a id="mobile-nav-toggle">
<span class="mobile-nav-toggle-bar"></span>
<span class="mobile-nav-toggle-bar"></span>
<span class="mobile-nav-toggle-bar"></span>
</a> -->
</div>
</div>
</div>
<script type="text/javascript">
$('body').css('background', 'white');
</script>
<div class="container">
<div class="row">
<div aria-label="main navigation" class="sphinxsidebar leftsidebar" role="navigation">
<div class="sphinxsidebarwrapper">
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../api/python/index.html">Python Documents</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../api/r/index.html">R Documents</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../api/julia/index.html">Julia Documents</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../api/c++/index.html">C++ Documents</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../api/scala/index.html">Scala Documents</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../api/perl/index.html">Perl Documents</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../faq/index.html">HowTo Documents</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../architecture/index.html">System Documents</a></li>
<li class="toctree-l1"><a class="reference internal" href="../index.html">Tutorials</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../community/index.html">Community</a></li>
</ul>
</div>
</div>
<div class="content">
<div class="page-tracker"></div>
<div class="section" id="csrndarray-ndarray-in-compressed-sparse-row-storage-format">
<span id="csrndarray-ndarray-in-compressed-sparse-row-storage-format"></span><h1>CSRNDArray - NDArray in Compressed Sparse Row Storage Format<a class="headerlink" href="#csrndarray-ndarray-in-compressed-sparse-row-storage-format" title="Permalink to this headline"></a></h1>
<p>Many real world datasets deal with high dimensional sparse feature vectors. Take for instance a recommendation system where the number of categories and users is on the order of millions. The purchase data for each category by user would show that most users only make a few purchases, leading to a dataset with high sparsity (i.e. most of the elements are zeros).</p>
<p>Storing and manipulating such large sparse matrices in the default dense structure results in wasted memory and processing on the zeros. To take advantage of the sparse structure of the matrix, the <code class="docutils literal"><span class="pre">CSRNDArray</span></code> in MXNet stores the matrix in <a class="reference external" href="https://en.wikipedia.org/wiki/Sparse_matrix#Compressed_sparse_row_.28CSR.2C_CRS_or_Yale_format.29">compressed sparse row (CSR)</a> format and uses specialized algorithms in operators.
<strong>The format is designed for 2D matrices with a large number of columns,
and each row is sparse (i.e. with only a few nonzeros).</strong></p>
<div class="section" id="advantages-of-compressed-sparse-row-ndarray-csrndarray">
<span id="advantages-of-compressed-sparse-row-ndarray-csrndarray"></span><h2>Advantages of Compressed Sparse Row NDArray (CSRNDArray)<a class="headerlink" href="#advantages-of-compressed-sparse-row-ndarray-csrndarray" title="Permalink to this headline"></a></h2>
<p>For matrices of high sparsity (e.g. ~1% non-zeros = ~1% density), there are two primary advantages of <code class="docutils literal"><span class="pre">CSRNDArray</span></code> over the existing <code class="docutils literal"><span class="pre">NDArray</span></code>:</p>
<ul class="simple">
<li>memory consumption is reduced significantly</li>
<li>certain operations are much faster (e.g. matrix-vector multiplication)</li>
</ul>
<p>You may be familiar with the CSR storage format in <a class="reference external" href="https://www.scipy.org/">SciPy</a> and will note the similarities in MXNet’s implementation. However there are some additional competitive features in <code class="docutils literal"><span class="pre">CSRNDArray</span></code> inherited from <code class="docutils literal"><span class="pre">NDArray</span></code>, such as non-blocking asynchronous evaluation and automatic parallelization that are not available in SciPy’s flavor of CSR. You can find further explanations for evaluation and parallelization strategy in MXNet in the <a class="reference external" href="https://mxnet.incubator.apache.org/tutorials/basic/ndarray.html#lazy-evaluation-and-automatic-parallelization">NDArray tutorial</a>.</p>
<p>The introduction of <code class="docutils literal"><span class="pre">CSRNDArray</span></code> also brings a new attribute, <code class="docutils literal"><span class="pre">stype</span></code> as a holder for storage type info, to <code class="docutils literal"><span class="pre">NDArray</span></code>. You can query <strong>ndarray.stype</strong> now in addition to the oft-queried attributes such as <strong>ndarray.shape</strong>, <strong>ndarray.dtype</strong>, and <strong>ndarray.context</strong>. For a typical dense NDArray, the value of <code class="docutils literal"><span class="pre">stype</span></code> is <strong>“default”</strong>. For a <code class="docutils literal"><span class="pre">CSRNDArray</span></code>, the value of stype is <strong>“csr”</strong>.</p>
</div>
<div class="section" id="prerequisites">
<span id="prerequisites"></span><h2>Prerequisites<a class="headerlink" href="#prerequisites" title="Permalink to this headline"></a></h2>
<p>To complete this tutorial, you will need:</p>
<ul>
<li><p class="first">MXNet. See the instructions for your operating system in <a class="reference external" href="https://mxnet.incubator.apache.org/versions/master/install/index.html">Setup and Installation</a></p>
</li>
<li><p class="first"><a class="reference external" href="http://jupyter.org/">Jupyter</a></p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">pip</span> <span class="n">install</span> <span class="n">jupyter</span>
</pre></div>
</div>
</li>
<li><p class="first">Basic knowledge of NDArray in MXNet. See the detailed tutorial for NDArray in <a class="reference external" href="https://mxnet.incubator.apache.org/tutorials/basic/ndarray.html">NDArray - Imperative tensor operations on CPU/GPU</a>.</p>
</li>
<li><p class="first">SciPy - A section of this tutorial uses SciPy package in Python. If you don’t have SciPy, the example in that section will be ignored.</p>
</li>
<li><p class="first">GPUs - A section of this tutorial uses GPUs. If you don’t have GPUs on your machine, simply set the variable <code class="docutils literal"><span class="pre">gpu_device</span></code> (set in the GPUs section of this tutorial) to <code class="docutils literal"><span class="pre">mx.cpu()</span></code>.</p>
</li>
</ul>
</div>
<div class="section" id="compressed-sparse-row-matrix">
<span id="compressed-sparse-row-matrix"></span><h2>Compressed Sparse Row Matrix<a class="headerlink" href="#compressed-sparse-row-matrix" title="Permalink to this headline"></a></h2>
<p>A CSRNDArray represents a 2D matrix as three separate 1D arrays: <strong>data</strong>, <strong>indptr</strong> and <strong>indices</strong>, where the column indices for row <code class="docutils literal"><span class="pre">i</span></code> are stored in <code class="docutils literal"><span class="pre">indices[indptr[i]:indptr[i+1]]</span></code> in ascending order, and their corresponding values are stored in <code class="docutils literal"><span class="pre">data[indptr[i]:indptr[i+1]]</span></code>.</p>
<ul class="simple">
<li><strong>data</strong>: CSR format data array of the matrix</li>
<li><strong>indices</strong>: CSR format index array of the matrix</li>
<li><strong>indptr</strong>: CSR format index pointer array of the matrix</li>
</ul>
<div class="section" id="example-matrix-compression">
<span id="example-matrix-compression"></span><h3>Example Matrix Compression<a class="headerlink" href="#example-matrix-compression" title="Permalink to this headline"></a></h3>
<p>For example, given the matrix:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="p">[[</span><span class="mi">7</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]]</span>
</pre></div>
</div>
<p>We can compress this matrix using CSR, and to do so we need to calculate <code class="docutils literal"><span class="pre">data</span></code>, <code class="docutils literal"><span class="pre">indices</span></code>, and <code class="docutils literal"><span class="pre">indptr</span></code>.</p>
<p>The <code class="docutils literal"><span class="pre">data</span></code> array holds all the non-zero entries of the matrix in row-major order. Put another way, you create a data array that has all of the zeros removed from the matrix, row by row, storing the numbers in that order. Your result:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">data</span> <span class="o">=</span> <span class="p">[</span><span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">]</span>
</pre></div>
</div>
<p>The <code class="docutils literal"><span class="pre">indices</span></code> array stores the column index for each non-zero element in <code class="docutils literal"><span class="pre">data</span></code>. As you cycle through the data array, starting with 7, you can see it is in column 0. Then looking at 8, you can see it is in column 2. Lastly 9 is in column 1. Your result:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">indices</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span>
</pre></div>
</div>
<p>The <code class="docutils literal"><span class="pre">indptr</span></code> array is what will help identify the rows where the data appears. It stores the offset into <code class="docutils literal"><span class="pre">data</span></code> of the first non-zero element number of each row of the matrix. This array always starts with 0 (reasons can be explored later), so indptr[0] is 0. Each subsequent value in the array is the aggregate number of non-zero elements up to that row. Looking at the first row of the matrix you can see two non-zero values, so indptr[1] is 2. The next row contains all zeros, so the aggregate is still 2, so indptr[2] is 2. Finally, you see the last row contains one non-zero element bring the aggregate to 3, so indptr[3] is 3. To reconstruct the dense matrix, you will use <code class="docutils literal"><span class="pre">data[0:2]</span></code> and <code class="docutils literal"><span class="pre">indices[0:2]</span></code> for the first row, <code class="docutils literal"><span class="pre">data[2:2]</span></code> and <code class="docutils literal"><span class="pre">indices[2:2]</span></code> for the second row (which contains all zeros), and <code class="docutils literal"><span class="pre">data[2:3]</span></code> and <code class="docutils literal"><span class="pre">indices[2:3]</span></code> for the third row. Your result:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">indptr</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
</pre></div>
</div>
<p>Note that in MXNet, the column indices for a given row are always sorted in ascending order,
and duplicated column indices for the same row are not allowed.</p>
</div>
</div>
<div class="section" id="array-creation">
<span id="array-creation"></span><h2>Array Creation<a class="headerlink" href="#array-creation" title="Permalink to this headline"></a></h2>
<p>There are a few different ways to create a <code class="docutils literal"><span class="pre">CSRNDArray</span></code>, but first let’s recreate the matrix we just discussed using the <code class="docutils literal"><span class="pre">data</span></code>, <code class="docutils literal"><span class="pre">indices</span></code>, and <code class="docutils literal"><span class="pre">indptr</span></code> we calculated in the previous example.</p>
<p>You can create a CSRNDArray with data, indices and indptr by using the <code class="docutils literal"><span class="pre">csr_matrix</span></code> function:</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">mxnet</span> <span class="kn">as</span> <span class="nn">mx</span>
<span class="c1"># Create a CSRNDArray with python lists</span>
<span class="n">shape</span> <span class="o">=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
<span class="n">data_list</span> <span class="o">=</span> <span class="p">[</span><span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">]</span>
<span class="n">indices_list</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span>
<span class="n">indptr_list</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">sparse</span><span class="o">.</span><span class="n">csr_matrix</span><span class="p">((</span><span class="n">data_list</span><span class="p">,</span> <span class="n">indices_list</span><span class="p">,</span> <span class="n">indptr_list</span><span class="p">),</span> <span class="n">shape</span><span class="o">=</span><span class="n">shape</span><span class="p">)</span>
<span class="c1"># Inspect the matrix</span>
<span class="n">a</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">()</span>
</pre></div>
</div>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">array</span><span class="p">([[</span> <span class="mf">7.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">,</span> <span class="mf">8.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">],</span>
<span class="p">[</span> <span class="mf">0.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">],</span>
<span class="p">[</span> <span class="mf">0.</span><span class="p">,</span> <span class="mf">9.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">]],</span> <span class="n">dtype</span><span class="o">=</span><span class="n">float32</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">as</span> <span class="nn">np</span>
<span class="c1"># Create a CSRNDArray with numpy arrays</span>
<span class="n">data_np</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">])</span>
<span class="n">indptr_np</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">])</span>
<span class="n">indices_np</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">])</span>
<span class="n">b</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">sparse</span><span class="o">.</span><span class="n">csr_matrix</span><span class="p">((</span><span class="n">data_np</span><span class="p">,</span> <span class="n">indices_np</span><span class="p">,</span> <span class="n">indptr_np</span><span class="p">),</span> <span class="n">shape</span><span class="o">=</span><span class="n">shape</span><span class="p">)</span>
<span class="n">b</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">()</span>
</pre></div>
</div>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">array</span><span class="p">([[</span><span class="mi">7</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span>
<span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span>
<span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]])</span>
</pre></div>
</div>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="c1"># Compare the two. They are exactly the same.</span>
<span class="p">{</span><span class="s1">'a'</span><span class="p">:</span><span class="n">a</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">(),</span> <span class="s1">'b'</span><span class="p">:</span><span class="n">b</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">()}</span>
</pre></div>
</div>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="p">{</span><span class="s1">'a'</span><span class="p">:</span> <span class="n">array</span><span class="p">([[</span> <span class="mf">7.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">,</span> <span class="mf">8.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">],</span>
<span class="p">[</span> <span class="mf">0.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">],</span>
<span class="p">[</span> <span class="mf">0.</span><span class="p">,</span> <span class="mf">9.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">]],</span> <span class="n">dtype</span><span class="o">=</span><span class="n">float32</span><span class="p">),</span> <span class="s1">'b'</span><span class="p">:</span> <span class="n">array</span><span class="p">([[</span><span class="mi">7</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span>
<span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span>
<span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]])}</span>
</pre></div>
</div>
<p>You can create an MXNet CSRNDArray from a <code class="docutils literal"><span class="pre">scipy.sparse.csr.csr_matrix</span></code> object by using the <code class="docutils literal"><span class="pre">array</span></code> function:</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="k">try</span><span class="p">:</span>
<span class="kn">import</span> <span class="nn">scipy.sparse</span> <span class="kn">as</span> <span class="nn">spsp</span>
<span class="c1"># generate a csr matrix in scipy</span>
<span class="n">c</span> <span class="o">=</span> <span class="n">spsp</span><span class="o">.</span><span class="n">csr</span><span class="o">.</span><span class="n">csr_matrix</span><span class="p">((</span><span class="n">data_np</span><span class="p">,</span> <span class="n">indices_np</span><span class="p">,</span> <span class="n">indptr_np</span><span class="p">),</span> <span class="n">shape</span><span class="o">=</span><span class="n">shape</span><span class="p">)</span>
<span class="c1"># create a CSRNDArray from a scipy csr object</span>
<span class="n">d</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">sparse</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s1">'d:{}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">()))</span>
<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="s2">"scipy package is required"</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">d</span><span class="p">:[[</span><span class="mi">7</span> <span class="mi">0</span> <span class="mi">8</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">9</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]]</span>
</pre></div>
</div>
<p>What if you have a big set of data and you haven’t calculated indices or indptr yet? Let’s try a simple CSRNDArray from an existing array of data and derive those values with some built-in functions. We can mockup a “big” dataset with a random amount of the data being non-zero, then compress it by using the <code class="docutils literal"><span class="pre">tostype</span></code> function, which is explained further in the <a class="reference external" href="#storage-type-conversion">Storage Type Conversion</a> section:</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="n">big_array</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">round</span><span class="p">(</span><span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="n">low</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">high</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="mi">1000</span><span class="p">,</span> <span class="mi">100</span><span class="p">)))</span>
<span class="k">print</span><span class="p">(</span><span class="n">big_array</span><span class="p">)</span>
<span class="n">big_array_csr</span> <span class="o">=</span> <span class="n">big_array</span><span class="o">.</span><span class="n">tostype</span><span class="p">(</span><span class="s1">'csr'</span><span class="p">)</span>
<span class="c1"># Access indices array</span>
<span class="n">indices</span> <span class="o">=</span> <span class="n">big_array_csr</span><span class="o">.</span><span class="n">indices</span>
<span class="c1"># Access indptr array</span>
<span class="n">indptr</span> <span class="o">=</span> <span class="n">big_array_csr</span><span class="o">.</span><span class="n">indptr</span>
<span class="c1"># Access data array</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">big_array_csr</span><span class="o">.</span><span class="n">data</span>
<span class="c1"># The total size of `data`, `indices` and `indptr` arrays is much lesser than the dense big_array!</span>
</pre></div>
</div>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="p">[[</span> <span class="mf">1.</span> <span class="mf">1.</span> <span class="mf">0.</span> <span class="o">...</span><span class="p">,</span> <span class="mf">0.</span> <span class="mf">1.</span> <span class="mf">1.</span><span class="p">]</span>
<span class="p">[</span> <span class="mf">0.</span> <span class="mf">0.</span> <span class="mf">0.</span> <span class="o">...</span><span class="p">,</span> <span class="mf">0.</span> <span class="mf">0.</span> <span class="mf">1.</span><span class="p">]</span>
<span class="p">[</span> <span class="mf">1.</span> <span class="mf">0.</span> <span class="mf">0.</span> <span class="o">...</span><span class="p">,</span> <span class="mf">1.</span> <span class="mf">0.</span> <span class="mf">0.</span><span class="p">]</span>
<span class="o">...</span><span class="p">,</span>
<span class="p">[</span> <span class="mf">0.</span> <span class="mf">1.</span> <span class="mf">1.</span> <span class="o">...</span><span class="p">,</span> <span class="mf">0.</span> <span class="mf">0.</span> <span class="mf">0.</span><span class="p">]</span>
<span class="p">[</span> <span class="mf">1.</span> <span class="mf">1.</span> <span class="mf">0.</span> <span class="o">...</span><span class="p">,</span> <span class="mf">1.</span> <span class="mf">0.</span> <span class="mf">1.</span><span class="p">]</span>
<span class="p">[</span> <span class="mf">1.</span> <span class="mf">0.</span> <span class="mf">1.</span> <span class="o">...</span><span class="p">,</span> <span class="mf">1.</span> <span class="mf">0.</span> <span class="mf">0.</span><span class="p">]]</span>
<span class="o"><</span><span class="n">NDArray</span> <span class="mi">1000</span><span class="n">x100</span> <span class="nd">@cpu</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">></span>
</pre></div>
</div>
<p>You can also create a CSRNDArray from another using the <code class="docutils literal"><span class="pre">array</span></code> function specifying the element data type with the option <code class="docutils literal"><span class="pre">dtype</span></code>,
which accepts a numpy type. By default, <code class="docutils literal"><span class="pre">float32</span></code> is used.</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="c1"># Float32 is used by default</span>
<span class="n">e</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">sparse</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
<span class="c1"># Create a 16-bit float array</span>
<span class="n">f</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">float16</span><span class="p">)</span>
<span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">dtype</span><span class="p">,</span> <span class="n">f</span><span class="o">.</span><span class="n">dtype</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">float32</span><span class="p">,</span> <span class="n">numpy</span><span class="o">.</span><span class="n">float16</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="inspecting-arrays">
<span id="inspecting-arrays"></span><h2>Inspecting Arrays<a class="headerlink" href="#inspecting-arrays" title="Permalink to this headline"></a></h2>
<p>A variety of methods are available for you to use for inspecting CSR arrays:</p>
<ul class="simple">
<li><strong>.asnumpy()</strong></li>
<li><strong>.data</strong></li>
<li><strong>.indices</strong></li>
<li><strong>.indptr</strong></li>
</ul>
<p>As you have seen already, we can inspect the contents of a <code class="docutils literal"><span class="pre">CSRNDArray</span></code> by filling
its contents into a dense <code class="docutils literal"><span class="pre">numpy.ndarray</span></code> using the <code class="docutils literal"><span class="pre">asnumpy</span></code> function.</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="n">a</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">()</span>
</pre></div>
</div>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">array</span><span class="p">([[</span> <span class="mf">7.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">,</span> <span class="mf">8.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">],</span>
<span class="p">[</span> <span class="mf">0.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">],</span>
<span class="p">[</span> <span class="mf">0.</span><span class="p">,</span> <span class="mf">9.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">]],</span> <span class="n">dtype</span><span class="o">=</span><span class="n">float32</span><span class="p">)</span>
</pre></div>
</div>
<p>You can also inspect the internal storage of a CSRNDArray by accessing attributes such as <code class="docutils literal"><span class="pre">indptr</span></code>, <code class="docutils literal"><span class="pre">indices</span></code> and <code class="docutils literal"><span class="pre">data</span></code>:</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="c1"># Access data array</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="n">data</span>
<span class="c1"># Access indices array</span>
<span class="n">indices</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="n">indices</span>
<span class="c1"># Access indptr array</span>
<span class="n">indptr</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="n">indptr</span>
<span class="p">{</span><span class="s1">'a.stype'</span><span class="p">:</span> <span class="n">a</span><span class="o">.</span><span class="n">stype</span><span class="p">,</span> <span class="s1">'data'</span><span class="p">:</span><span class="n">data</span><span class="p">,</span> <span class="s1">'indices'</span><span class="p">:</span><span class="n">indices</span><span class="p">,</span> <span class="s1">'indptr'</span><span class="p">:</span><span class="n">indptr</span><span class="p">}</span>
</pre></div>
</div>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="p">{</span><span class="s1">'a.stype'</span><span class="p">:</span> <span class="s1">'csr'</span><span class="p">,</span> <span class="s1">'data'</span><span class="p">:</span>
<span class="p">[</span> <span class="mf">7.</span> <span class="mf">8.</span> <span class="mf">9.</span><span class="p">]</span>
<span class="o"><</span><span class="n">NDArray</span> <span class="mi">3</span> <span class="nd">@cpu</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">></span><span class="p">,</span> <span class="s1">'indices'</span><span class="p">:</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">2</span> <span class="mi">1</span><span class="p">]</span>
<span class="o"><</span><span class="n">NDArray</span> <span class="mi">3</span> <span class="nd">@cpu</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">></span><span class="p">,</span> <span class="s1">'indptr'</span><span class="p">:</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">3</span><span class="p">]</span>
<span class="o"><</span><span class="n">NDArray</span> <span class="mi">4</span> <span class="nd">@cpu</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">></span><span class="p">}</span>
</pre></div>
</div>
</div>
<div class="section" id="storage-type-conversion">
<span id="storage-type-conversion"></span><h2>Storage Type Conversion<a class="headerlink" href="#storage-type-conversion" title="Permalink to this headline"></a></h2>
<p>You can also convert storage types with:</p>
<ul class="simple">
<li><strong>tostype</strong></li>
<li><strong>cast_storage</strong></li>
</ul>
<p>To convert an NDArray to a CSRNDArray and vice versa by using the <code class="docutils literal"><span class="pre">tostype</span></code> function:</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="c1"># Create a dense NDArray</span>
<span class="n">ones</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">ones</span><span class="p">((</span><span class="mi">2</span><span class="p">,</span><span class="mi">2</span><span class="p">))</span>
<span class="c1"># Cast the storage type from `default` to `csr`</span>
<span class="n">csr</span> <span class="o">=</span> <span class="n">ones</span><span class="o">.</span><span class="n">tostype</span><span class="p">(</span><span class="s1">'csr'</span><span class="p">)</span>
<span class="c1"># Cast the storage type from `csr` to `default`</span>
<span class="n">dense</span> <span class="o">=</span> <span class="n">csr</span><span class="o">.</span><span class="n">tostype</span><span class="p">(</span><span class="s1">'default'</span><span class="p">)</span>
<span class="p">{</span><span class="s1">'csr'</span><span class="p">:</span><span class="n">csr</span><span class="p">,</span> <span class="s1">'dense'</span><span class="p">:</span><span class="n">dense</span><span class="p">}</span>
</pre></div>
</div>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="p">{</span><span class="s1">'csr'</span><span class="p">:</span>
<span class="o"><</span><span class="n">CSRNDArray</span> <span class="mi">2</span><span class="n">x2</span> <span class="nd">@cpu</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">></span><span class="p">,</span> <span class="s1">'dense'</span><span class="p">:</span>
<span class="p">[[</span> <span class="mf">1.</span> <span class="mf">1.</span><span class="p">]</span>
<span class="p">[</span> <span class="mf">1.</span> <span class="mf">1.</span><span class="p">]]</span>
<span class="o"><</span><span class="n">NDArray</span> <span class="mi">2</span><span class="n">x2</span> <span class="nd">@cpu</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">></span><span class="p">}</span>
</pre></div>
</div>
<p>To convert the storage type by using the <code class="docutils literal"><span class="pre">cast_storage</span></code> operator:</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="c1"># Create a dense NDArray</span>
<span class="n">ones</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">ones</span><span class="p">((</span><span class="mi">2</span><span class="p">,</span><span class="mi">2</span><span class="p">))</span>
<span class="c1"># Cast the storage type to `csr`</span>
<span class="n">csr</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">sparse</span><span class="o">.</span><span class="n">cast_storage</span><span class="p">(</span><span class="n">ones</span><span class="p">,</span> <span class="s1">'csr'</span><span class="p">)</span>
<span class="c1"># Cast the storage type to `default`</span>
<span class="n">dense</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">sparse</span><span class="o">.</span><span class="n">cast_storage</span><span class="p">(</span><span class="n">csr</span><span class="p">,</span> <span class="s1">'default'</span><span class="p">)</span>
<span class="p">{</span><span class="s1">'csr'</span><span class="p">:</span><span class="n">csr</span><span class="p">,</span> <span class="s1">'dense'</span><span class="p">:</span><span class="n">dense</span><span class="p">}</span>
</pre></div>
</div>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="p">{</span><span class="s1">'csr'</span><span class="p">:</span>
<span class="o"><</span><span class="n">CSRNDArray</span> <span class="mi">2</span><span class="n">x2</span> <span class="nd">@cpu</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">></span><span class="p">,</span> <span class="s1">'dense'</span><span class="p">:</span>
<span class="p">[[</span> <span class="mf">1.</span> <span class="mf">1.</span><span class="p">]</span>
<span class="p">[</span> <span class="mf">1.</span> <span class="mf">1.</span><span class="p">]]</span>
<span class="o"><</span><span class="n">NDArray</span> <span class="mi">2</span><span class="n">x2</span> <span class="nd">@cpu</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">></span><span class="p">}</span>
</pre></div>
</div>
</div>
<div class="section" id="copies">
<span id="copies"></span><h2>Copies<a class="headerlink" href="#copies" title="Permalink to this headline"></a></h2>
<p>You can use the <code class="docutils literal"><span class="pre">copy</span></code> method which makes a deep copy of the array and its data, and returns a new array.
You can also use the <code class="docutils literal"><span class="pre">copyto</span></code> method or the slice operator <code class="docutils literal"><span class="pre">[]</span></code> to deep copy to an existing array.</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="n">a</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">ones</span><span class="p">((</span><span class="mi">2</span><span class="p">,</span><span class="mi">2</span><span class="p">))</span><span class="o">.</span><span class="n">tostype</span><span class="p">(</span><span class="s1">'csr'</span><span class="p">)</span>
<span class="n">b</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="n">c</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">sparse</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="s1">'csr'</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">2</span><span class="p">))</span>
<span class="n">c</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">a</span>
<span class="n">d</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">sparse</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="s1">'csr'</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">2</span><span class="p">))</span>
<span class="n">a</span><span class="o">.</span><span class="n">copyto</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
<span class="p">{</span><span class="s1">'b is a'</span><span class="p">:</span> <span class="n">b</span> <span class="ow">is</span> <span class="n">a</span><span class="p">,</span> <span class="s1">'b.asnumpy()'</span><span class="p">:</span><span class="n">b</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">(),</span> <span class="s1">'c.asnumpy()'</span><span class="p">:</span><span class="n">c</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">(),</span> <span class="s1">'d.asnumpy()'</span><span class="p">:</span><span class="n">d</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">()}</span>
</pre></div>
</div>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="p">{</span><span class="s1">'b is a'</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s1">'b.asnumpy()'</span><span class="p">:</span> <span class="n">array</span><span class="p">([[</span> <span class="mf">1.</span><span class="p">,</span> <span class="mf">1.</span><span class="p">],</span>
<span class="p">[</span> <span class="mf">1.</span><span class="p">,</span> <span class="mf">1.</span><span class="p">]],</span> <span class="n">dtype</span><span class="o">=</span><span class="n">float32</span><span class="p">),</span> <span class="s1">'c.asnumpy()'</span><span class="p">:</span> <span class="n">array</span><span class="p">([[</span> <span class="mf">1.</span><span class="p">,</span> <span class="mf">1.</span><span class="p">],</span>
<span class="p">[</span> <span class="mf">1.</span><span class="p">,</span> <span class="mf">1.</span><span class="p">]],</span> <span class="n">dtype</span><span class="o">=</span><span class="n">float32</span><span class="p">),</span> <span class="s1">'d.asnumpy()'</span><span class="p">:</span> <span class="n">array</span><span class="p">([[</span> <span class="mf">1.</span><span class="p">,</span> <span class="mf">1.</span><span class="p">],</span>
<span class="p">[</span> <span class="mf">1.</span><span class="p">,</span> <span class="mf">1.</span><span class="p">]],</span> <span class="n">dtype</span><span class="o">=</span><span class="n">float32</span><span class="p">)}</span>
</pre></div>
</div>
<p>If the storage types of source array and destination array do not match,
the storage type of destination array will not change when copying with <code class="docutils literal"><span class="pre">copyto</span></code> or
the slice operator <code class="docutils literal"><span class="pre">[]</span></code>.</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="n">e</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">sparse</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="s1">'csr'</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">2</span><span class="p">))</span>
<span class="n">f</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">sparse</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="s1">'csr'</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">2</span><span class="p">))</span>
<span class="n">g</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">ones</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>
<span class="n">e</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">g</span>
<span class="n">g</span><span class="o">.</span><span class="n">copyto</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
<span class="p">{</span><span class="s1">'e.stype'</span><span class="p">:</span><span class="n">e</span><span class="o">.</span><span class="n">stype</span><span class="p">,</span> <span class="s1">'f.stype'</span><span class="p">:</span><span class="n">f</span><span class="o">.</span><span class="n">stype</span><span class="p">,</span> <span class="s1">'g.stype'</span><span class="p">:</span><span class="n">g</span><span class="o">.</span><span class="n">stype</span><span class="p">}</span>
</pre></div>
</div>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="p">{</span><span class="s1">'e.stype'</span><span class="p">:</span> <span class="s1">'csr'</span><span class="p">,</span> <span class="s1">'f.stype'</span><span class="p">:</span> <span class="s1">'csr'</span><span class="p">,</span> <span class="s1">'g.stype'</span><span class="p">:</span> <span class="s1">'default'</span><span class="p">}</span>
</pre></div>
</div>
</div>
<div class="section" id="indexing-and-slicing">
<span id="indexing-and-slicing"></span><h2>Indexing and Slicing<a class="headerlink" href="#indexing-and-slicing" title="Permalink to this headline"></a></h2>
<p>You can slice a CSRNDArray on axis 0 with operator <code class="docutils literal"><span class="pre">[]</span></code>, which copies the slices and returns a new CSRNDArray.</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="n">a</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">6</span><span class="p">)</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">2</span><span class="p">))</span><span class="o">.</span><span class="n">tostype</span><span class="p">(</span><span class="s1">'csr'</span><span class="p">)</span>
<span class="n">b</span> <span class="o">=</span> <span class="n">a</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="mi">2</span><span class="p">]</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">()</span>
<span class="n">c</span> <span class="o">=</span> <span class="n">a</span><span class="p">[:]</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">()</span>
<span class="p">{</span><span class="s1">'a'</span><span class="p">:</span><span class="n">a</span><span class="p">,</span> <span class="s1">'b'</span><span class="p">:</span><span class="n">b</span><span class="p">,</span> <span class="s1">'c'</span><span class="p">:</span><span class="n">c</span><span class="p">}</span>
</pre></div>
</div>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="p">{</span><span class="s1">'a'</span><span class="p">:</span>
<span class="o"><</span><span class="n">CSRNDArray</span> <span class="mi">3</span><span class="n">x2</span> <span class="nd">@cpu</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">></span><span class="p">,</span>
<span class="s1">'b'</span><span class="p">:</span> <span class="n">array</span><span class="p">([[</span> <span class="mf">2.</span><span class="p">,</span> <span class="mf">3.</span><span class="p">]],</span> <span class="n">dtype</span><span class="o">=</span><span class="n">float32</span><span class="p">),</span>
<span class="s1">'c'</span><span class="p">:</span> <span class="n">array</span><span class="p">([[</span> <span class="mf">0.</span><span class="p">,</span> <span class="mf">1.</span><span class="p">],</span>
<span class="p">[</span> <span class="mf">2.</span><span class="p">,</span> <span class="mf">3.</span><span class="p">],</span>
<span class="p">[</span> <span class="mf">4.</span><span class="p">,</span> <span class="mf">5.</span><span class="p">]],</span> <span class="n">dtype</span><span class="o">=</span><span class="n">float32</span><span class="p">)}</span>
</pre></div>
</div>
<p>Note that multi-dimensional indexing or slicing along a particular axis is currently not supported for a CSRNDArray.</p>
</div>
<div class="section" id="sparse-operators-and-storage-type-inference">
<span id="sparse-operators-and-storage-type-inference"></span><h2>Sparse Operators and Storage Type Inference<a class="headerlink" href="#sparse-operators-and-storage-type-inference" title="Permalink to this headline"></a></h2>
<p>Operators that have specialized implementation for sparse arrays can be accessed in <code class="docutils literal"><span class="pre">mx.nd.sparse</span></code>. You can read the <a class="reference external" href="https://mxnet.incubator.apache.org/versions/master/api/python/ndarray/sparse.html">mxnet.ndarray.sparse API documentation</a> to find what sparse operators are available.</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="n">shape</span> <span class="o">=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
<span class="n">data</span> <span class="o">=</span> <span class="p">[</span><span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">]</span>
<span class="n">indptr</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
<span class="n">indices</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">sparse</span><span class="o">.</span><span class="n">csr_matrix</span><span class="p">((</span><span class="n">data</span><span class="p">,</span> <span class="n">indices</span><span class="p">,</span> <span class="n">indptr</span><span class="p">),</span> <span class="n">shape</span><span class="o">=</span><span class="n">shape</span><span class="p">)</span> <span class="c1"># a csr matrix as lhs</span>
<span class="n">rhs</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">ones</span><span class="p">((</span><span class="mi">4</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span> <span class="c1"># a dense vector as rhs</span>
<span class="n">out</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">sparse</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">rhs</span><span class="p">)</span> <span class="c1"># invoke sparse dot operator specialized for dot(csr, dense)</span>
<span class="p">{</span><span class="s1">'out'</span><span class="p">:</span><span class="n">out</span><span class="p">}</span>
</pre></div>
</div>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="p">{</span><span class="s1">'out'</span><span class="p">:</span>
<span class="p">[[</span> <span class="mf">15.</span><span class="p">]</span>
<span class="p">[</span> <span class="mf">0.</span><span class="p">]</span>
<span class="p">[</span> <span class="mf">9.</span><span class="p">]]</span>
<span class="o"><</span><span class="n">NDArray</span> <span class="mi">3</span><span class="n">x1</span> <span class="nd">@cpu</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">></span><span class="p">}</span>
</pre></div>
</div>
<p>For any sparse operator, the storage type of output array is inferred based on inputs. You can either read the documentation or inspect the <code class="docutils literal"><span class="pre">stype</span></code> attribute of the output array to know what storage type is inferred:</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="n">b</span> <span class="o">=</span> <span class="n">a</span> <span class="o">*</span> <span class="mi">2</span> <span class="c1"># b will be a CSRNDArray since zero multiplied by 2 is still zero</span>
<span class="n">c</span> <span class="o">=</span> <span class="n">a</span> <span class="o">+</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">ones</span><span class="p">(</span><span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">))</span> <span class="c1"># c will be a dense NDArray</span>
<span class="p">{</span><span class="s1">'b.stype'</span><span class="p">:</span><span class="n">b</span><span class="o">.</span><span class="n">stype</span><span class="p">,</span> <span class="s1">'c.stype'</span><span class="p">:</span><span class="n">c</span><span class="o">.</span><span class="n">stype</span><span class="p">}</span>
</pre></div>
</div>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="p">{</span><span class="s1">'b.stype'</span><span class="p">:</span> <span class="s1">'csr'</span><span class="p">,</span> <span class="s1">'c.stype'</span><span class="p">:</span> <span class="s1">'default'</span><span class="p">}</span>
</pre></div>
</div>
<p>For operators that don’t specialize in sparse arrays, we can still use them with sparse inputs with some performance penalty. In MXNet, dense operators require all inputs and outputs to be in the dense format.</p>
<p>If sparse inputs are provided, MXNet will convert sparse inputs into dense ones temporarily, so that the dense operator can be used.</p>
<p>If sparse outputs are provided, MXNet will convert the dense outputs generated by the dense operator into the provided sparse format.</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="n">e</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">sparse</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="s1">'csr'</span><span class="p">,</span> <span class="n">a</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>
<span class="n">d</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="c1"># dense operator with a sparse input</span>
<span class="n">e</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">out</span><span class="o">=</span><span class="n">e</span><span class="p">)</span> <span class="c1"># dense operator with a sparse output</span>
<span class="p">{</span><span class="s1">'a.stype'</span><span class="p">:</span><span class="n">a</span><span class="o">.</span><span class="n">stype</span><span class="p">,</span> <span class="s1">'d.stype'</span><span class="p">:</span><span class="n">d</span><span class="o">.</span><span class="n">stype</span><span class="p">,</span> <span class="s1">'e.stype'</span><span class="p">:</span><span class="n">e</span><span class="o">.</span><span class="n">stype</span><span class="p">}</span> <span class="c1"># stypes of a and e will be not changed</span>
</pre></div>
</div>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="p">{</span><span class="s1">'a.stype'</span><span class="p">:</span> <span class="s1">'csr'</span><span class="p">,</span> <span class="s1">'d.stype'</span><span class="p">:</span> <span class="s1">'default'</span><span class="p">,</span> <span class="s1">'e.stype'</span><span class="p">:</span> <span class="s1">'csr'</span><span class="p">}</span>
</pre></div>
</div>
<p>Note that warning messages will be printed when such a storage fallback event happens. If you are using jupyter notebook, the warning message will be printed in your terminal console.</p>
</div>
<div class="section" id="data-loading">
<span id="data-loading"></span><h2>Data Loading<a class="headerlink" href="#data-loading" title="Permalink to this headline"></a></h2>
<p>You can load data in batches from a CSRNDArray using <code class="docutils literal"><span class="pre">mx.io.NDArrayIter</span></code>:</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="c1"># Create the source CSRNDArray</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">36</span><span class="p">)</span><span class="o">.</span><span class="n">reshape</span><span class="p">((</span><span class="mi">9</span><span class="p">,</span><span class="mi">4</span><span class="p">)))</span><span class="o">.</span><span class="n">tostype</span><span class="p">(</span><span class="s1">'csr'</span><span class="p">)</span>
<span class="n">labels</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">ones</span><span class="p">([</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="p">])</span>
<span class="n">batch_size</span> <span class="o">=</span> <span class="mi">3</span>
<span class="n">dataiter</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">io</span><span class="o">.</span><span class="n">NDArrayIter</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">labels</span><span class="p">,</span> <span class="n">batch_size</span><span class="p">,</span> <span class="n">last_batch_handle</span><span class="o">=</span><span class="s1">'discard'</span><span class="p">)</span>
<span class="c1"># Inspect the data batches</span>
<span class="p">[</span><span class="n">batch</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">batch</span> <span class="ow">in</span> <span class="n">dataiter</span><span class="p">]</span>
</pre></div>
</div>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="p">[</span>
<span class="o"><</span><span class="n">CSRNDArray</span> <span class="mi">3</span><span class="n">x4</span> <span class="nd">@cpu</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">></span><span class="p">,</span>
<span class="o"><</span><span class="n">CSRNDArray</span> <span class="mi">3</span><span class="n">x4</span> <span class="nd">@cpu</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">></span><span class="p">,</span>
<span class="o"><</span><span class="n">CSRNDArray</span> <span class="mi">3</span><span class="n">x4</span> <span class="nd">@cpu</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">></span><span class="p">]</span>
</pre></div>
</div>
<p>You can also load data stored in the <a class="reference external" href="https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/">libsvm file format</a> using <code class="docutils literal"><span class="pre">mx.io.LibSVMIter</span></code>, where the format is: <code class="docutils literal"><span class="pre"><label></span> <span class="pre"><col_idx1>:<value1></span> <span class="pre"><col_idx2>:<value2></span> <span class="pre">...</span> <span class="pre"><col_idxN>:<valueN></span></code>. Each line in the file records the label and the column indices and data for non-zero entries. For example, for a matrix with 6 columns, <code class="docutils literal"><span class="pre">1</span> <span class="pre">2:1.5</span> <span class="pre">4:-3.5</span></code> means the label is <code class="docutils literal"><span class="pre">1</span></code>, the data is <code class="docutils literal"><span class="pre">[[0,</span> <span class="pre">0,</span> <span class="pre">1,5,</span> <span class="pre">0,</span> <span class="pre">-3.5,</span> <span class="pre">0]]</span></code>. More detailed examples of <code class="docutils literal"><span class="pre">mx.io.LibSVMIter</span></code> are available in the <a class="reference external" href="https://mxnet.incubator.apache.org/versions/master/api/python/io/io.html#mxnet.io.LibSVMIter">API documentation</a>.</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="c1"># Create a sample libsvm file in current working directory</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="n">cwd</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">getcwd</span><span class="p">()</span>
<span class="n">data_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">cwd</span><span class="p">,</span> <span class="s1">'data.t'</span><span class="p">)</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">data_path</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">fout</span><span class="p">:</span>
<span class="n">fout</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'1.0 0:1 2:2</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
<span class="n">fout</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'1.0 0:3 5:4</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
<span class="n">fout</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'1.0 2:5 8:6 9:7</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
<span class="n">fout</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'1.0 3:8</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
<span class="n">fout</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'-1 0:0.5 9:1.5</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
<span class="n">fout</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'-2.0</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
<span class="n">fout</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'-3.0 0:-0.6 1:2.25 2:1.25</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
<span class="n">fout</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'-3.0 1:2 2:-1.25</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
<span class="n">fout</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'4 2:-1.2</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
<span class="c1"># Load CSRNDArrays from the file</span>
<span class="n">data_train</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">io</span><span class="o">.</span><span class="n">LibSVMIter</span><span class="p">(</span><span class="n">data_libsvm</span><span class="o">=</span><span class="n">data_path</span><span class="p">,</span> <span class="n">data_shape</span><span class="o">=</span><span class="p">(</span><span class="mi">10</span><span class="p">,),</span> <span class="n">label_shape</span><span class="o">=</span><span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="n">batch_size</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span>
<span class="k">for</span> <span class="n">batch</span> <span class="ow">in</span> <span class="n">data_train</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="n">data_train</span><span class="o">.</span><span class="n">getdata</span><span class="p">())</span>
<span class="k">print</span><span class="p">(</span><span class="n">data_train</span><span class="o">.</span><span class="n">getlabel</span><span class="p">())</span>
</pre></div>
</div>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="o"><</span><span class="n">CSRNDArray</span> <span class="mi">3</span><span class="n">x10</span> <span class="nd">@cpu</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">></span>
<span class="p">[</span> <span class="mf">1.</span> <span class="mf">1.</span> <span class="mf">1.</span><span class="p">]</span>
<span class="o"><</span><span class="n">NDArray</span> <span class="mi">3</span> <span class="nd">@cpu</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">></span>
<span class="o"><</span><span class="n">CSRNDArray</span> <span class="mi">3</span><span class="n">x10</span> <span class="nd">@cpu</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">></span>
<span class="p">[</span> <span class="mf">1.</span> <span class="o">-</span><span class="mf">1.</span> <span class="o">-</span><span class="mf">2.</span><span class="p">]</span>
<span class="o"><</span><span class="n">NDArray</span> <span class="mi">3</span> <span class="nd">@cpu</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">></span>
<span class="o"><</span><span class="n">CSRNDArray</span> <span class="mi">3</span><span class="n">x10</span> <span class="nd">@cpu</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">></span>
<span class="p">[</span><span class="o">-</span><span class="mf">3.</span> <span class="o">-</span><span class="mf">3.</span> <span class="mf">4.</span><span class="p">]</span>
<span class="o"><</span><span class="n">NDArray</span> <span class="mi">3</span> <span class="nd">@cpu</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">></span>
</pre></div>
</div>
<p>Note that in the file the column indices are expected to be sorted in ascending order per row, and be zero-based instead of one-based.</p>
</div>
<div class="section" id="advanced-topics">
<span id="advanced-topics"></span><h2>Advanced Topics<a class="headerlink" href="#advanced-topics" title="Permalink to this headline"></a></h2>
<div class="section" id="gpu-support">
<span id="gpu-support"></span><h3>GPU Support<a class="headerlink" href="#gpu-support" title="Permalink to this headline"></a></h3>
<p>By default, <code class="docutils literal"><span class="pre">CSRNDArray</span></code> operators are executed on CPU. In MXNet, GPU support for <code class="docutils literal"><span class="pre">CSRNDArray</span></code> is experimental with only a few sparse operators such as <code class="docutils literal"><span class="pre">cast_storage</span></code> and <code class="docutils literal"><span class="pre">dot</span></code>.</p>
<p>To create a <code class="docutils literal"><span class="pre">CSRNDArray</span></code> on a GPU, we need to explicitly specify the context:</p>
<p><strong>Note</strong> If a GPU is not available, an error will be reported in the following section. In order to execute it a cpu, set <code class="docutils literal"><span class="pre">gpu_device</span></code> to <code class="docutils literal"><span class="pre">mx.cpu()</span></code>.</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="n">gpu_device</span><span class="o">=</span><span class="n">mx</span><span class="o">.</span><span class="n">gpu</span><span class="p">()</span> <span class="c1"># Change this to mx.cpu() in absence of GPUs.</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">sparse</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="s1">'csr'</span><span class="p">,</span> <span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">),</span> <span class="n">ctx</span><span class="o">=</span><span class="n">gpu_device</span><span class="p">)</span>
<span class="n">a</span>
<span class="k">except</span> <span class="n">mx</span><span class="o">.</span><span class="n">MXNetError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">err</span><span class="p">))</span>
</pre></div>
</div>
<div class="btn-group" role="group">
<div class="download-btn"><a download="csr.ipynb" href="csr.ipynb"><span class="glyphicon glyphicon-download-alt"></span> csr.ipynb</a></div></div></div>
</div>
</div>
</div>
</div>
<div aria-label="main navigation" class="sphinxsidebar rightsidebar" role="navigation">
<div class="sphinxsidebarwrapper">
<h3><a href="../../index.html">Table Of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">CSRNDArray - NDArray in Compressed Sparse Row Storage Format</a><ul>
<li><a class="reference internal" href="#advantages-of-compressed-sparse-row-ndarray-csrndarray">Advantages of Compressed Sparse Row NDArray (CSRNDArray)</a></li>
<li><a class="reference internal" href="#prerequisites">Prerequisites</a></li>
<li><a class="reference internal" href="#compressed-sparse-row-matrix">Compressed Sparse Row Matrix</a><ul>
<li><a class="reference internal" href="#example-matrix-compression">Example Matrix Compression</a></li>
</ul>
</li>
<li><a class="reference internal" href="#array-creation">Array Creation</a></li>
<li><a class="reference internal" href="#inspecting-arrays">Inspecting Arrays</a></li>
<li><a class="reference internal" href="#storage-type-conversion">Storage Type Conversion</a></li>
<li><a class="reference internal" href="#copies">Copies</a></li>
<li><a class="reference internal" href="#indexing-and-slicing">Indexing and Slicing</a></li>
<li><a class="reference internal" href="#sparse-operators-and-storage-type-inference">Sparse Operators and Storage Type Inference</a></li>
<li><a class="reference internal" href="#data-loading">Data Loading</a></li>
<li><a class="reference internal" href="#advanced-topics">Advanced Topics</a><ul>
<li><a class="reference internal" href="#gpu-support">GPU Support</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
</div><div class="footer">
<div class="section-disclaimer">
<div class="container">
<div>
<img height="60" src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/apache_incubator_logo.png"/>
<p>
Apache MXNet is an effort undergoing incubation at The Apache Software Foundation (ASF), <strong>sponsored by the <i>Apache Incubator</i></strong>. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
</p>
<p>
"Copyright © 2017-2018, The Apache Software Foundation
Apache MXNet, MXNet, Apache, the Apache feather, and the Apache MXNet project logo are either registered trademarks or trademarks of the Apache Software Foundation."
</p>
</div>
</div>
</div>
</div> <!-- pagename != index -->
</div>
<script crossorigin="anonymous" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<script src="../../_static/js/sidebar.js" type="text/javascript"></script>
<script src="../../_static/js/search.js" type="text/javascript"></script>
<script src="../../_static/js/navbar.js" type="text/javascript"></script>
<script src="../../_static/js/clipboard.min.js" type="text/javascript"></script>
<script src="../../_static/js/copycode.js" type="text/javascript"></script>
<script src="../../_static/js/page.js" type="text/javascript"></script>
<script type="text/javascript">
$('body').ready(function () {
$('body').css('visibility', 'visible');
});
</script>
</body>
</html>