Skip to content

Commit 58fbfef

Browse files
committed
Added view/copy example
1 parent 7b0704a commit 58fbfef

File tree

2 files changed

+40
-2
lines changed

2 files changed

+40
-2
lines changed

03-anatomy.rst

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -304,8 +304,8 @@ modifies the base array while this is not true in the second case:
304304
[ 0. 0. 0. 0. 0. 0. 0. 0. 0.]
305305
306306
Thus, if you need fancy indexing, it's better to keep a copy of you fancy index
307-
and to work with it:
308-
307+
(especially if it was complex to compute it) and to work with it:
308+
309309
.. code:: pycon
310310
311311
>>> Z = np.zeros(9)
@@ -314,7 +314,11 @@ and to work with it:
314314
>>> print(Z)
315315
[ 1. 1. 1. 0. 0. 0. 0. 0. 0.]
316316
317+
If you are unsure if the result of you indexing is a view or a copy, you can
318+
check what is the `base` of your result. If it is `None`, then you result is a
319+
copy:
317320
321+
318322
.. code:: pycon
319323
320324
>>> Z = np.random.uniform(0,1,(5,,5))
@@ -326,6 +330,18 @@ and to work with it:
326330
True
327331
>>> print(Z2.base is Z)
328332
False
333+
>>> print(Z2.base is None)
334+
True
335+
336+
Note that some numpy functions return a view while some others return a copy:
337+
338+
.. code:: pycon
339+
340+
>>> Z = np.arange(9).reshape(3,3).copy()
341+
>>> Z.ravel().base is Z
342+
True
343+
>>> Z.flatten().base is Z
344+
False
329345
330346
331347
Temporary copy

book.html

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -649,6 +649,18 @@ <h3><a class="toc-backref" href="#id2">Direct and indirect access</a></h3>
649649
<span class="generic prompt">&gt;&gt;&gt; </span><span class="keyword">print</span><span class="punctuation">(</span><span class="name">Z</span><span class="punctuation">)</span>
650650
<span class="generic output">[ 0. 0. 0. 0. 0. 0. 0. 0. 0.]</span>
651651
</pre>
652+
<p>Thus, if you need fancy indexing, it's better to keep a copy of you fancy index
653+
(especially if it was complex to compute it) and to work with it:</p>
654+
<pre class="code pycon literal-block">
655+
<span class="name"></span><span class="generic prompt">&gt;&gt;&gt; </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">9</span><span class="punctuation">)</span>
656+
<span class="generic prompt">&gt;&gt;&gt; </span><span class="name">index</span> <span class="operator">=</span> <span class="punctuation">[</span><span class="literal number integer">0</span><span class="punctuation">,</span><span class="literal number integer">1</span><span class="punctuation">,</span><span class="literal number integer">2</span><span class="punctuation">]</span>
657+
<span class="generic prompt">&gt;&gt;&gt; </span><span class="name">Z</span><span class="punctuation">[</span><span class="name">index</span><span class="punctuation">]</span> <span class="operator">=</span> <span class="literal number integer">1</span>
658+
<span class="generic prompt">&gt;&gt;&gt; </span><span class="keyword">print</span><span class="punctuation">(</span><span class="name">Z</span><span class="punctuation">)</span>
659+
<span class="generic output">[ 1. 1. 1. 0. 0. 0. 0. 0. 0.]</span>
660+
</pre>
661+
<p>If you are unsure if the result of you indexing is a view or a copy, you can
662+
check what is the <code>base</code> of your result. If it is <code>None</code>, then you result is a
663+
copy:</p>
652664
<pre class="code pycon literal-block">
653665
<span class="name"></span><span class="generic prompt">&gt;&gt;&gt; </span><span class="name">Z</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">uniform</span><span class="punctuation">(</span><span class="literal number integer">0</span><span class="punctuation">,</span><span class="literal number integer">1</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>
654666
<span class="generic prompt">&gt;&gt;&gt; </span><span class="name">Z1</span> <span class="operator">=</span> <span class="name">Z</span><span class="punctuation">[:</span><span class="literal number integer">3</span><span class="punctuation">,:]</span>
@@ -658,6 +670,16 @@ <h3><a class="toc-backref" href="#id2">Direct and indirect access</a></h3>
658670
</span><span class="keyword"></span><span class="generic prompt">&gt;&gt;&gt; </span><span class="keyword">print</span><span class="punctuation">(</span><span class="name">Z1</span><span class="operator">.</span><span class="name">base</span> <span class="operator word">is</span> <span class="name">Z</span><span class="punctuation">)</span>
659671
<span class="generic output">True
660672
</span><span class="keyword"></span><span class="generic prompt">&gt;&gt;&gt; </span><span class="keyword">print</span><span class="punctuation">(</span><span class="name">Z2</span><span class="operator">.</span><span class="name">base</span> <span class="operator word">is</span> <span class="name">Z</span><span class="punctuation">)</span>
673+
<span class="generic output">False
674+
</span><span class="keyword"></span><span class="generic prompt">&gt;&gt;&gt; </span><span class="keyword">print</span><span class="punctuation">(</span><span class="name">Z2</span><span class="operator">.</span><span class="name">base</span> <span class="operator word">is</span> <span class="name builtin pseudo">None</span><span class="punctuation">)</span>
675+
<span class="generic output">True</span>
676+
</pre>
677+
<p>Note that some numpy functions return a view while some others return a copy:</p>
678+
<pre class="code pycon literal-block">
679+
<span class="name"></span><span class="generic prompt">&gt;&gt;&gt; </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">9</span><span class="punctuation">)</span><span class="operator">.</span><span class="name">reshape</span><span class="punctuation">(</span><span class="literal number integer">3</span><span class="punctuation">,</span><span class="literal number integer">3</span><span class="punctuation">)</span><span class="operator">.</span><span class="name">copy</span><span class="punctuation">()</span>
680+
<span class="generic prompt">&gt;&gt;&gt; </span><span class="name">Z</span><span class="operator">.</span><span class="name">ravel</span><span class="punctuation">()</span><span class="operator">.</span><span class="name">base</span> <span class="operator word">is</span> <span class="name">Z</span>
681+
<span class="generic output">True
682+
</span><span class="name"></span><span class="generic prompt">&gt;&gt;&gt; </span><span class="name">Z</span><span class="operator">.</span><span class="name">flatten</span><span class="punctuation">()</span><span class="operator">.</span><span class="name">base</span> <span class="operator word">is</span> <span class="name">Z</span>
661683
<span class="generic output">False</span>
662684
</pre>
663685
</div>

0 commit comments

Comments
 (0)