[Numpy-discussion] array copy-to-self and views
Christopher Barker
Chris.Barker@noaa....
Thu Feb 1 14:12:34 CST 2007
Zachary Pincus wrote:
>>> I recently was trying to write code to modify an array in-place (so
>>> as not to invalidate any references to that array)
>> I'm not sure what this means exactly.
>
> Say one wants to keep two different variables referencing a single in-
> memory list, as so:
> a = [1,2,3]
> b = a
> Now, if 'b' and 'a' go to live in different places (different class
> instances or whatever) but we want 'b' and 'a' to always refer to the
> same in-memory object, so that 'id(a) == id(b)', we need to make sure
> to not assign a brand new list to either one.
OK, got it, but numpy arrays are not quite the same as lists, there is
the additional complication that two different array objects can share
the same data:
>>> b = a[:]
>>> a = N.ones((5,))
>>> b = a[:]
>>> a is b
False
>>> a[2] = 5
>>> a
array([ 1., 1., 5., 1., 1.])
>>> b
array([ 1., 1., 5., 1., 1.])
This is very useful, but can be tricky. In a way, it's like a nested list:
>>> a = [[1,2,3,4]]
>>> b = [a[0]]
>>> a is b
False
>>> a[0][2] = 5
>>> a
[[1, 2, 5, 4]]
>>> b
[[1, 2, 5, 4]]
hey! changing a changed b too!
So key is that in your case, it probably doesn't matter if a and b are
the same object, as long as they share the same data, and having
multiple arrays sharing the same data is a common idiom in numpy.
> That is, if we do something like 'a = [i + 1 for i in a]' then 'id
> (a) != id(b)'. However, we can do 'a[:] = [i + 1 for i in a]' to
> modify a in-place.
Ah, but at Travis pointed out, the difference is not in assignment or
anything like that, but in the fact that a list comprehension produces a
copy, which is analogous to :
flipud(a).copy
In numpy, you DO need to be aware of when you are getting copies, and
when you are getting views, and what the consequences are.
So really, the only "bug" here is in the docs -- they should make it
clear whether a function returns a copy or a view.
-Chris
--
Christopher Barker, Ph.D.
Oceanographer
Emergency Response Division
NOAA/NOS/OR&R (206) 526-6959 voice
7600 Sand Point Way NE (206) 526-6329 fax
Seattle, WA 98115 (206) 526-6317 main reception
Chris.Barker@noaa.gov
More information about the Numpy-discussion
mailing list