<div class="gmail_quote">I agree with Robert, don't use locals(). I should have added a disclaimer "this is very hackish and probably not a good idea", sorry ;)  (interesting read: <a href="http://stackoverflow.com/questions/1450275/modifying-locals-in-python">http://stackoverflow.com/questions/1450275/modifying-locals-in-python</a>)<br>
<br>From what you said I think what you really want is f to work in-place. This also has the advantage of minimizing memory allocations.<br>If you can't directly modify f, you can also do:<br><br>def f_inplace(x):<br>
  x[:] = f(x)<br><br>then just call map(f_inplace, [a, b, c, d]). However note that there will be some memory temporarily allocated to store the result of f(x) (so it is not as optimal as ensuring f directly works in-place).<br>
<br>In addition to the dictionary workaround mentioned by Robert, if it is not practical to have all your variables of interest into a single dictionary, you can instead declare your variables as one-element lists, or use a class with a single field:<br>
<br>1. a = [numpy.array(...)]<br>    a[0] = f(a[0])<br><br>2. class ArrayHolder(object):<br>        def __init__(self, arr):<br>             self.arr = arr<br><br>   a = ArrayHolder(numpy.array(...))<br>   a.arr = f(a.arr)<br>
<br>But of course it is not as convenient to write a[0] or a.arr instead of just a.<br><br>-=- Olivier<br><br>2011/9/13 Robert Kern <span dir="ltr"><<a href="mailto:robert.kern@gmail.com">robert.kern@gmail.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div class="im">On Tue, Sep 13, 2011 at 01:53, David Froger <<a href="mailto:david.froger@gmail.com">david.froger@gmail.com</a>> wrote:<br>

><br>
> Thank you Olivier and Robert for your replies!<br>
><br>
> Some remarks about the dictionnary solution:<br>
><br>
> from numpy import *<br>
><br>
> def f(arr):<br>
>     return arr + 100.<br>
><br>
> arrs = {}<br>
> arrs['a'] = array( [1,1,1] )<br>
> arrs['b'] = array( [2,2,2] )<br>
> arrs['c'] = array( [3,3,3] )<br>
> arrs['d'] = array( [4,4,4] )<br>
><br>
> for key,value in arrs.iteritems():<br>
>    arrs[key] = f(value)<br>
><br>
> 1. about the memory<br>
> Memory is first allocated with the array functions:<br>
>    arrs['a'] = array( [1,1,1] )<br>
>    arrs['b'] = array( [2,2,2] )<br>
>    arrs['c'] = array( [3,3,3] )<br>
>    arrs['d'] = array( [4,4,4] )<br>
><br>
> Are there others memory allocations with this assignemnt:<br>
>    arrs[key] = f(value)<br>
> or is the already allocated memory used to store the result of f(value)?<br>
><br>
> In other words, if I have N arrays of the same shape, each of them costing<br>
> nbytes of memory, does it use N*nbytes memory, or 2*N*bytes?<br>
<br>
</div>Temporarily, yes, for all of the variations mentioned. When the<br>
expression "f(value)" is evaluated, both the result array and the<br>
input array will exist simultaneously in memory. Once the assignment<br>
happens, the original input array will be destroyed and free up the<br>
memory. There is no difference memory-wise between assigning into a<br>
dictionary or assigning to a variable name.<br>
<br>
Sometimes, you can write your f() such that you just need to do<br>
<br>
  f(value)<br>
<br>
and have the value object modified in-place. In that case, there is no<br>
need to reassign the result to a variable or dictionary key.<br>
<div class="im"><br>
> I think this is well documented on the web and I can find it....<br>
><br>
> 2. about individual array<br>
> The problem is that now, if one want to use a individual array, one have now to<br>
> use:<br>
>    arrs['a']<br>
> instead of just:<br>
>    a<br>
> So I'm sometime tempted to use locals() instead of arrs...<br>
<br>
</div>Seriously, don't. It makes your code worse, not better. It's also<br>
unreliable. The locals() dictionary is meant to be read-only (and even<br>
then for debugger tooling and the like, not regular code), and this is<br>
sometimes enforced. If you want to use variable names instead of<br>
dictionaries, use them, but write out each assignment statement.<br>
<div class="im"><br>
--<br>
Robert Kern<br>
<br>
"I have come to believe that the whole world is an enigma, a harmless<br>
enigma that is made terrible by our own mad attempt to interpret it as<br>
though it had an underlying truth."<br>
  -- Umberto Eco<br>
_______________________________________________<br>
</div><div><div></div><div class="h5">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>
</div></div></blockquote></div><br>