Added new exercice (How to get the diagonal of a dot product)

This commit is contained in:
Nicolas Rougier 2015-08-16 20:48:42 +02:00
parent 61f0bcc00b
commit ba2b2b0f9b
2 changed files with 33 additions and 0 deletions

View File

@ -348,6 +348,22 @@ using a vector S of same size describing subset indices ?</p>
<span class="name">D_counts</span> <span class="operator">=</span> <span class="name">np</span><span class="operator">.</span><span class="name">bincount</span><span class="punctuation">(</span><span class="name">S</span><span class="punctuation">)</span>
<span class="name">D_means</span> <span class="operator">=</span> <span class="name">D_sums</span> <span class="operator">/</span> <span class="name">D_counts</span>
<span class="keyword">print</span> <span class="name">D_means</span>
<span class="name">I</span> <span class="name">often</span> <span class="name">need</span> <span class="name">to</span> <span class="name">compute</span> <span class="name">the</span> <span class="name">equivalent</span> <span class="name">of</span>
</pre>
</li>
<li><p class="first">How to get the diagonal of a dot product ?</p>
<pre class="code python literal-block">
<span class="comment"># Author: Mathieu Blondel</span>
<span class="comment"># Slow version</span>
<span class="name">np</span><span class="operator">.</span><span class="name">diag</span><span class="punctuation">(</span><span class="name">np</span><span class="operator">.</span><span class="name">dot</span><span class="punctuation">(</span><span class="name">A</span><span class="punctuation">,</span> <span class="name">B</span><span class="punctuation">))</span>
<span class="comment"># Fast version</span>
<span class="name">np</span><span class="operator">.</span><span class="name">sum</span><span class="punctuation">(</span><span class="name">A</span> <span class="operator">*</span> <span class="name">B</span><span class="operator">.</span><span class="name">T</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="comment"># Faster version</span>
<span class="name">np</span><span class="operator">.</span><span class="name">einsum</span><span class="punctuation">(</span><span class="literal string">&quot;ij,ji-&gt;i&quot;</span><span class="punctuation">,</span> <span class="name">A</span><span class="punctuation">,</span> <span class="name">B</span><span class="punctuation">)</span><span class="operator">.</span>
</pre>
</li>
<li><p class="first">Consider the vector [1, 2, 3, 4, 5], how to build a new vector with 3

View File

@ -417,6 +417,23 @@ Thanks to Michiaki Ariga, there is now a
D_means = D_sums / D_counts
print D_means
I often need to compute the equivalent of
#. How to get the diagonal of a dot product ?
.. code-block:: python
# Author: Mathieu Blondel
# Slow version
np.diag(np.dot(A, B))
# Fast version
np.sum(A * B.T, axis=1)
# Faster version
np.einsum("ij,ji->i", A, B).
#. Consider the vector [1, 2, 3, 4, 5], how to build a new vector with 3
consecutive zeros interleaved between each value ?