Included exercises from Evgeni Burovski (@ev-br), close #7

This commit is contained in:
Nicolas P. Rougier 2016-03-09 07:27:39 +01:00
parent 275d8e4a29
commit b7d801c3e2
2 changed files with 95 additions and 11 deletions

View File

@ -164,6 +164,18 @@ python -c <span class="literal string double">&quot;import numpy; numpy.info(num
<span class="keyword">print</span><span class="punctuation">(</span><span class="name">Z</span><span class="punctuation">)</span>
</pre>
</li>
<li><p class="first">Given a 1D array, negate all elements which are between 3 and 8, in place. (★☆☆)
.. code-block:: python</p>
<blockquote>
<p># Author: Evgeni Burovski</p>
<p>Z = np.arange(11)
Z[(3 &lt; Z) &amp; (Z &lt;= 8)] <a href="#id1"><span class="problematic" id="id2">*</span></a>= -1</p>
<div class="system-message" id="id1">
<p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">README.rst</tt>, line 209); <em><a href="#id2">backlink</a></em></p>
<p>Inline emphasis start-string without end-string.</p>
</div>
</blockquote>
</li>
<li><p class="first">Create a 5x5 matrix with row values ranging from 0 to 4 (★★☆)</p>
<pre class="code python literal-block">
<span class="name">Z</span> <span class="operator">=</span> <span class="name">np</span><span class="operator">.</span><span class="name">zeros</span><span class="punctuation">((</span><span class="literal number integer">5</span><span class="punctuation">,</span><span class="literal number integer">5</span><span class="punctuation">))</span>
@ -194,6 +206,14 @@ array (★☆☆)</p>
<span class="keyword">print</span><span class="punctuation">(</span><span class="name">Z</span><span class="punctuation">)</span>
</pre>
</li>
<li><p class="first">How to sum a small array faster than np.sum ? (★★☆)</p>
<pre class="code python literal-block">
<span class="comment single"># Author: Evgeni Burovski</span>
<span class="name">Z</span> <span class="operator">=</span> <span class="name">np</span><span class="operator">.</span><span class="name">arange</span><span class="punctuation">(</span><span class="literal number integer">10</span><span class="punctuation">)</span>
<span class="name">np</span><span class="operator">.</span><span class="name">add</span><span class="operator">.</span><span class="name">reduce</span><span class="punctuation">(</span><span class="name">Z</span><span class="punctuation">)</span>
</pre>
</li>
<li><p class="first">Consider two random array A anb B, check if they are equal (★★☆)</p>
<pre class="code python literal-block">
<span class="name">A</span> <span class="operator">=</span> <span class="name">np</span><span class="operator">.</span><span class="name">random</span><span class="operator">.</span><span class="name">randint</span><span class="punctuation">(</span><span class="literal number integer">0</span><span class="punctuation">,</span><span class="literal number integer">2</span><span class="punctuation">,</span><span class="literal number integer">5</span><span class="punctuation">)</span>
@ -236,6 +256,16 @@ them to polar coordinates (★★☆)</p>
<span class="keyword">print</span><span class="punctuation">(</span><span class="name">Z</span><span class="punctuation">)</span>
</pre>
</li>
<li><p class="first">Given two arrays, X and Y, construct the Cauchy matrix C (Cij = 1/(xi - yj))</p>
<pre class="code python literal-block">
<span class="comment single"># Author: Evgeni Burovski</span>
<span class="name">X</span> <span class="operator">=</span> <span class="name">np</span><span class="operator">.</span><span class="name">arange</span><span class="punctuation">(</span><span class="literal number integer">8</span><span class="punctuation">)</span>
<span class="name">Y</span> <span class="operator">=</span> <span class="name">X</span> <span class="operator">+</span> <span class="literal number float">0.5</span>
<span class="name">C</span> <span class="operator">=</span> <span class="literal number float">1.0</span> <span class="operator">/</span> <span class="name">np</span><span class="operator">.</span><span class="name">subtract</span><span class="operator">.</span><span class="name">outer</span><span class="punctuation">(</span><span class="name">X</span><span class="punctuation">,</span> <span class="name">Y</span><span class="punctuation">)</span>
<span class="keyword">print</span><span class="punctuation">(</span><span class="name">np</span><span class="operator">.</span><span class="name">linalg</span><span class="operator">.</span><span class="name">det</span><span class="punctuation">(</span><span class="name">C</span><span class="punctuation">))</span>
</pre>
</li>
<li><p class="first">Print the minimum and maximum representable value for each numpy scalar type (★★☆)</p>
<pre class="code python literal-block">
<span class="keyword">for</span> <span class="name">dtype</span> <span class="operator word">in</span> <span class="punctuation">[</span><span class="name">np</span><span class="operator">.</span><span class="name">int8</span><span class="punctuation">,</span> <span class="name">np</span><span class="operator">.</span><span class="name">int32</span><span class="punctuation">,</span> <span class="name">np</span><span class="operator">.</span><span class="name">int64</span><span class="punctuation">]:</span>
@ -254,13 +284,6 @@ them to polar coordinates (★★☆)</p>
<span class="keyword">print</span><span class="punctuation">(</span><span class="name">Z</span><span class="punctuation">)</span>
</pre>
</li>
<li><p class="first">How to print all the values of an array ? (★★☆)</p>
<pre class="code python literal-block">
<span class="name">np</span><span class="operator">.</span><span class="name">set_printoptions</span><span class="punctuation">(</span><span class="name">threshold</span><span class="operator">=</span><span class="name">np</span><span class="operator">.</span><span class="name">nan</span><span class="punctuation">)</span>
<span class="name">Z</span> <span class="operator">=</span> <span class="name">np</span><span class="operator">.</span><span class="name">zeros</span><span class="punctuation">((</span><span class="literal number integer">25</span><span class="punctuation">,</span><span class="literal number integer">25</span><span class="punctuation">))</span>
<span class="keyword">print</span><span class="punctuation">(</span><span class="name">Z</span><span class="punctuation">)</span>
</pre>
</li>
<li><p class="first">How to find the closest value (to a given scalar) in an array ? (★★☆)</p>
<pre class="code python literal-block">
<span class="name">Z</span> <span class="operator">=</span> <span class="name">np</span><span class="operator">.</span><span class="name">arange</span><span class="punctuation">(</span><span class="literal number integer">100</span><span class="punctuation">)</span>
@ -706,7 +729,6 @@ How to compute the sum of of the p matrix products at once ? (result has shape (
</pre>
</li>
<li><p class="first">How to get the n largest values of an array (★★★)</p>
<blockquote>
<pre class="code python literal-block">
<span class="name">Z</span> <span class="operator">=</span> <span class="name">np</span><span class="operator">.</span><span class="name">arange</span><span class="punctuation">(</span><span class="literal number integer">10000</span><span class="punctuation">)</span>
<span class="name">np</span><span class="operator">.</span><span class="name">random</span><span class="operator">.</span><span class="name">shuffle</span><span class="punctuation">(</span><span class="name">Z</span><span class="punctuation">)</span>
@ -718,7 +740,6 @@ How to compute the sum of of the p matrix products at once ? (result has shape (
<span class="comment single"># Fast</span>
<span class="keyword">print</span> <span class="punctuation">(</span><span class="name">Z</span><span class="punctuation">[</span><span class="name">np</span><span class="operator">.</span><span class="name">argpartition</span><span class="punctuation">(</span><span class="operator">-</span><span class="name">Z</span><span class="punctuation">,</span><span class="name">n</span><span class="punctuation">)[:</span><span class="name">n</span><span class="punctuation">]])</span>
</pre>
</blockquote>
</li>
<li><p class="first">Given an arbitrary number of vectors, build the cartesian product (every
combinations of every item) (★★★)</p>
@ -846,6 +867,21 @@ equidistant samples (★★★) ?</p>
<span class="name">y_int</span> <span class="operator">=</span> <span class="name">np</span><span class="operator">.</span><span class="name">interp</span><span class="punctuation">(</span><span class="name">r_int</span><span class="punctuation">,</span> <span class="name">r</span><span class="punctuation">,</span> <span class="name">y</span><span class="punctuation">)</span>
</pre>
</li>
<li><p class="first">Given an integer n and a 2D array X, select from X the rows which can be
interpreted as draws from a multinomial distribution with n degrees, i.e.,
the rows which only contain integers and which sum to n. (★★★)</p>
<pre class="code python literal-block">
<span class="comment single"># Author: Evgeni Burovski</span>
<span class="name">X</span> <span class="operator">=</span> <span class="name">np</span><span class="operator">.</span><span class="name">asarray</span><span class="punctuation">([[</span><span class="literal number float">1.0</span><span class="punctuation">,</span> <span class="literal number float">0.0</span><span class="punctuation">,</span> <span class="literal number float">3.0</span><span class="punctuation">,</span> <span class="literal number float">8.0</span><span class="punctuation">],</span>
<span class="punctuation">[</span><span class="literal number float">2.0</span><span class="punctuation">,</span> <span class="literal number float">0.0</span><span class="punctuation">,</span> <span class="literal number float">1.0</span><span class="punctuation">,</span> <span class="literal number float">1.0</span><span class="punctuation">],</span>
<span class="punctuation">[</span><span class="literal number float">1.5</span><span class="punctuation">,</span> <span class="literal number float">2.5</span><span class="punctuation">,</span> <span class="literal number float">1.0</span><span class="punctuation">,</span> <span class="literal number float">0.0</span><span class="punctuation">]])</span>
<span class="name">n</span> <span class="operator">=</span> <span class="literal number integer">4</span>
<span class="name">M</span> <span class="operator">=</span> <span class="name">np</span><span class="operator">.</span><span class="name">logical_and</span><span class="operator">.</span><span class="name">reduce</span><span class="punctuation">(</span><span class="name">np</span><span class="operator">.</span><span class="name">mod</span><span class="punctuation">(</span><span class="name">X</span><span class="punctuation">,</span> <span class="literal number integer">1</span><span class="punctuation">)</span> <span class="operator">==</span> <span class="literal number integer">0</span><span class="punctuation">,</span> <span class="name">axis</span><span class="operator">=-</span><span class="literal number integer">1</span><span class="punctuation">)</span>
<span class="name">M</span> <span class="operator">&amp;=</span> <span class="punctuation">(</span><span class="name">X</span><span class="operator">.</span><span class="name">sum</span><span class="punctuation">(</span><span class="name">axis</span><span class="operator">=-</span><span class="literal number integer">1</span><span class="punctuation">)</span> <span class="operator">==</span> <span class="name">n</span><span class="punctuation">)</span>
<span class="keyword">print</span><span class="punctuation">(</span><span class="name">X</span><span class="punctuation">[</span><span class="name">M</span><span class="punctuation">])</span>
</pre>
</li>
</ol>
</div>
</body>

View File

@ -201,6 +201,14 @@ Thanks to Michiaki Ariga, there is now a
Z = np.dot(np.ones((5,3)), np.ones((3,2)))
print(Z)
#. Given a 1D array, negate all elements which are between 3 and 8, in place. (★☆☆)
.. code-block:: python
# Author: Evgeni Burovski
Z = np.arange(11)
Z[(3 < Z) & (Z <= 8)] *= -1
#. Create a 5x5 matrix with row values ranging from 0 to 4 (★★☆)
@ -240,6 +248,16 @@ Thanks to Michiaki Ariga, there is now a
print(Z)
#. How to sum a small array faster than np.sum ? (★★☆)
.. code-block:: python
# Author: Evgeni Burovski
Z = np.arange(10)
np.add.reduce(Z)
#. Consider two random array A anb B, check if they are equal (★★☆)
.. code-block:: python
@ -293,6 +311,18 @@ Thanks to Michiaki Ariga, there is now a
print(Z)
#. Given two arrays, X and Y, construct the Cauchy matrix C (Cij = 1/(xi - yj))
.. code-block:: python
# Author: Evgeni Burovski
X = np.arange(8)
Y = X + 0.5
C = 1.0 / np.subtract.outer(X, Y)
print(np.linalg.det(C))
#. Print the minimum and maximum representable value for each numpy scalar type (★★☆)
.. code-block:: python
@ -920,6 +950,7 @@ Thanks to Michiaki Ariga, there is now a
print(U)
#. Convert a vector of ints into a matrix binary representation (★★★)
.. code-block:: python
@ -981,3 +1012,20 @@ Thanks to Michiaki Ariga, there is now a
r_int = np.linspace(0, r.max(), 200) # regular spaced path
x_int = np.interp(r_int, r, x) # integrate path
y_int = np.interp(r_int, r, y)
#. Given an integer n and a 2D array X, select from X the rows which can be
interpreted as draws from a multinomial distribution with n degrees, i.e.,
the rows which only contain integers and which sum to n. (★★★)
.. code-block:: python
# Author: Evgeni Burovski
X = np.asarray([[1.0, 0.0, 3.0, 8.0],
[2.0, 0.0, 1.0, 1.0],
[1.5, 2.5, 1.0, 0.0]])
n = 4
M = np.logical_and.reduce(np.mod(X, 1) == 0, axis=-1)
M &= (X.sum(axis=-1) == n)
print(X[M])