You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
<p>Note that some numpy functions return a view while some others return a copy:</p>
677
+
<p>Note that some numpy functions return a view when possible (e.g. <aclass="reference external" href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.ravel.html">ravel</a>)
678
+
while some others always return a copy (e.g. <aclass="reference external" href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.flatten.html#numpy.ndarray.flatten">flatten</a>):</p>
678
679
<preclass="code pycon literal-block">
679
-
<spanclass="name"></span><spanclass="generic prompt">>>> </span><spanclass="name">Z</span><spanclass="operator">=</span><spanclass="name">np</span><spanclass="operator">.</span><spanclass="name">arange</span><spanclass="punctuation">(</span><spanclass="literal number integer">9</span><spanclass="punctuation">)</span><spanclass="operator">.</span><spanclass="name">reshape</span><spanclass="punctuation">(</span><spanclass="literal number integer">3</span><spanclass="punctuation">,</span><spanclass="literal number integer">3</span><spanclass="punctuation">)</span><spanclass="operator">.</span><spanclass="name">copy</span><spanclass="punctuation">()</span>
680
+
<spanclass="name"></span><spanclass="generic prompt">>>> </span><spanclass="name">Z</span><spanclass="operator">=</span><spanclass="name">np</span><spanclass="operator">.</span><spanclass="name">zeros</span><spanclass="punctuation">((</span><spanclass="literal number integer">5</span><spanclass="punctuation">,</span><spanclass="literal number integer">5</span><spanclass="punctuation">))</span>
</span><spanclass="name"></span><spanclass="generic prompt">>>> </span><spanclass="name">Z</span><spanclass="punctuation">[::</span><spanclass="literal number integer">2</span><spanclass="punctuation">,::</span><spanclass="literal number integer">2</span><spanclass="punctuation">]</span><spanclass="operator">.</span><spanclass="name">ravel</span><spanclass="punctuation">()</span><spanclass="operator">.</span><spanclass="name">base</span><spanclass="operator word">is</span><spanclass="name">Z</span>
<p>Copies can be made explicitly like in the previous section, but the most
692
+
general case is the implicit creation of intermediate copies. This is the case
693
+
when you are doing some arithmetic with arrays:</p>
694
+
<preclass="code pycon literal-block">
695
+
<spanclass="name"></span><spanclass="generic prompt">>>> </span><spanclass="name">X</span><spanclass="operator">=</span><spanclass="name">np</span><spanclass="operator">.</span><spanclass="name">ones</span><spanclass="punctuation">(</span><spanclass="literal number integer">10</span><spanclass="punctuation">,</span><spanclass="name">dtype</span><spanclass="operator">=</span><spanclass="name">np</span><spanclass="operator">.</span><spanclass="name">int</span><spanclass="punctuation">)</span>
696
+
<spanclass="generic prompt">>>> </span><spanclass="name">Y</span><spanclass="operator">=</span><spanclass="name">np</span><spanclass="operator">.</span><spanclass="name">ones</span><spanclass="punctuation">(</span><spanclass="literal number integer">10</span><spanclass="punctuation">,</span><spanclass="name">dtype</span><spanclass="operator">=</span><spanclass="name">np</span><spanclass="operator">.</span><spanclass="name">int</span><spanclass="punctuation">)</span>
697
+
<spanclass="generic prompt">>>> </span><spanclass="name">A</span><spanclass="operator">=</span><spanclass="literal number integer">2</span><spanclass="operator">*</span><spanclass="name">X</span><spanclass="operator">+</span><spanclass="literal number integer">2</span><spanclass="operator">*</span><spanclass="name">Y</span>
698
+
</pre>
699
+
<p>In the example above, three intermediate arrays have been created. One for
700
+
holding the result of <code>2*X</code>, one for holding the result of <code>2*Y</code> and the last
701
+
one for holding the result of <code>2*X+2*Y</code>. In this specific case, the arrays are
702
+
small enough and this does not really make a difference. However, if your
703
+
arrays are big, then you have be careful with such expression and wonder if you
704
+
can do it differently. For example, if only the final result matters and you
705
+
don't need <code>X</code> nor <code>Y</code> afterwards, an alternate solution would be:</p>
706
+
<preclass="code pycon literal-block">
707
+
<spanclass="name"></span><spanclass="generic prompt">>>> </span><spanclass="name">X</span><spanclass="operator">=</span><spanclass="name">np</span><spanclass="operator">.</span><spanclass="name">ones</span><spanclass="punctuation">(</span><spanclass="literal number integer">10</span><spanclass="punctuation">,</span><spanclass="name">dtype</span><spanclass="operator">=</span><spanclass="name">np</span><spanclass="operator">.</span><spanclass="name">int</span><spanclass="punctuation">)</span>
708
+
<spanclass="generic prompt">>>> </span><spanclass="name">Y</span><spanclass="operator">=</span><spanclass="name">np</span><spanclass="operator">.</span><spanclass="name">ones</span><spanclass="punctuation">(</span><spanclass="literal number integer">10</span><spanclass="punctuation">,</span><spanclass="name">dtype</span><spanclass="operator">=</span><spanclass="name">np</span><spanclass="operator">.</span><spanclass="name">int</span><spanclass="punctuation">)</span>
709
+
<spanclass="generic prompt">>>> </span><spanclass="name">np</span><spanclass="operator">.</span><spanclass="name">multiply</span><spanclass="punctuation">(</span><spanclass="name">X</span><spanclass="punctuation">,</span><spanclass="literal number integer">2</span><spanclass="punctuation">,</span><spanclass="name">out</span><spanclass="operator">=</span><spanclass="name">X</span><spanclass="punctuation">)</span>
710
+
<spanclass="generic prompt">>>> </span><spanclass="name">np</span><spanclass="operator">.</span><spanclass="name">multiply</span><spanclass="punctuation">(</span><spanclass="name">Y</span><spanclass="punctuation">,</span><spanclass="literal number integer">2</span><spanclass="punctuation">,</span><spanclass="name">out</span><spanclass="operator">=</span><spanclass="name">Y</span><spanclass="punctuation">)</span>
<p>Using this alternate solution, no temporary array has been created. Problem is
714
+
that there are many other cases where such copies needs to be created and this
715
+
impact the performance like demonstrated on the example below:</p>
688
716
<preclass="code pycon literal-block">
689
717
<spanclass="name"></span><spanclass="generic prompt">>>> </span><spanclass="name">X</span><spanclass="operator">=</span><spanclass="name">np</span><spanclass="operator">.</span><spanclass="name">ones</span><spanclass="punctuation">(</span><spanclass="literal number integer">1000000000</span><spanclass="punctuation">,</span><spanclass="name">dtype</span><spanclass="operator">=</span><spanclass="name">np</span><spanclass="operator">.</span><spanclass="name">int</span><spanclass="punctuation">)</span>
690
718
<spanclass="generic prompt">>>> </span><spanclass="name">Y</span><spanclass="operator">=</span><spanclass="name">np</span><spanclass="operator">.</span><spanclass="name">ones</span><spanclass="punctuation">(</span><spanclass="literal number integer">1000000000</span><spanclass="punctuation">,</span><spanclass="name">dtype</span><spanclass="operator">=</span><spanclass="name">np</span><spanclass="operator">.</span><spanclass="name">int</span><spanclass="punctuation">)</span>
0 commit comments