Great! It looks like it is in fact working as desired:<div><br></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><div>In [4]: cube.shape</div><div>Out[4]: (5, 4096, 4096)</div>
<div><br></div><div>In [5]: slice = cube[0]</div><div><br></div><div>In [6]: cube[0,1000,1000]</div><div>Out[6]: 618</div><div><br></div><div>In [7]: slice[1000,1000]</div><div>Out[7]: 618</div><div><br></div><div>In [8]: slice[1000,1000] = 123</div>
<div><br></div><div>In [9]: cube[0, 1000,1000]</div><div>Out[9]: 123</div></div><div><br></div></blockquote>I didn&#39;t know about the .base attribute; that is really useful.<div><br></div><div>Thank you both for the feedback.</div>
<div>Keith</div><div><div><br><div class="gmail_quote">On Wed, Aug 17, 2011 at 1:46 PM, Aronne Merrelli <span dir="ltr">&lt;<a href="mailto:aronne.merrelli@gmail.com">aronne.merrelli@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br><br><div class="gmail_quote"><div class="im">On Wed, Aug 17, 2011 at 9:04 AM, Keith Hughitt <span dir="ltr">&lt;<a href="mailto:keith.hughitt@gmail.com" target="_blank">keith.hughitt@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br><div>Also, when subclassing ndarray and calling obj = data.view(cls) for an ndarray &quot;data&quot;, does this copy the data into the new object by value or reference? The method which extracts the 2d slice actually returns a subclass of ndarray created using the extracted data, so this is why I ask.</div>


<div><br></div><br></blockquote></div><div><br>I think it should pass a reference - the following code suggests the subclass is sharing the same fundamental array object. You can use the .base attribute of the ndarray object to see if it is a view back to another ndarray object:<br>

<br>import numpy as np<br>class TestClass(np.ndarray):<br>    def __new__(cls, inp_array):<br>        return inp_array.view(cls)<br> <br>In [2]: x = np.ones(5)<br>In [3]: obj = TestClass(x)<br>In [4]: id(x), id(obj), id(obj.base)<br>

Out[4]: (23517648, 19708080, 23517648)<br>In [5]: print x, obj<br>[ 1.  1.  1.  1.  1.] [ 1.  1.  1.  1.  1.]<br>In [6]: x[2] = 2<br>In [7]: print x, obj<br>[ 1.  1.  2.  1.  1.] [ 1.  1.  2.  1.  1.]<br><br><br>If you change the TestClass.__new__() to: &quot;return np.array(inp_array).view(cls)&quot; then you will make a copy of the input array instead, if that is needed. In that case, it looks like the .base attribute is a new ndarray, copied from the input array.<br>

<br><br>Aronne<br><br>[PS - also note that .base is set to None, if the ndarray is not a view into another ndarray; it turns out that None has a valid object number, which confused me at first - see id(None).]<br></div></div>

<br>_______________________________________________<br>
NumPy-Discussion mailing list<br>
<a href="mailto:NumPy-Discussion@scipy.org">NumPy-Discussion@scipy.org</a><br>
<a href="http://mail.scipy.org/mailman/listinfo/numpy-discussion" target="_blank">http://mail.scipy.org/mailman/listinfo/numpy-discussion</a><br>
<br></blockquote></div><br></div></div>