Function to resize global numpy array interactively in ipython

Robert Kern robert.kern at gmail.com
Mon Oct 29 18:07:04 CET 2007


David Sanders wrote:
> Hi,
> 
> I have a script with function definitions which I load into ipython
> for interactive use.
> These functions modify a global numpy array, whose size I need to be
> able to change interactively.  I thus have a script which looks like
> this:
> 
> from numpy import *
> 
> def do_resize(N):
> 	global a
> 	a = resize(a, N)
> 
> a = array([])
> 
> N=10; do_resize(N)
> print "Length of a is: ", len(a)
> N=20; do_resize(N)
> print "Length of a is: ", len(a)
> 
> 
> If I run this in ipython, using "run resize.py", it correctly outputs
> 10 and then 20.
> If I now type *interactively*  N=30; do_resize(N),  then the length of
> a is still 20, rather than 30 as I was hoping -- somehow I seem to be
> now dealing with a different copy of a?
> 
> Doing the same thing in idle works as I expect, i.e. interactively the
> size is changed to 30.
> 
> Could somebody please explain what's going on, and how I solve the
> problem?

By default, %run executes the script in its own namespace. Then the interactive
prompt's namespace gets updated with the values in that namespace. The global
statement refers to that initial namespace, not the one of the interactive
prompt. Give "%run -i resize.py" a try, though. That should execute the code in
the interactive prompt's namespace.

-- 
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
 that is made terrible by our own mad attempt to interpret it as though it had
 an underlying truth."
  -- Umberto Eco




More information about the Python-list mailing list