[Numpy-discussion] Vectorizing a function

Charles R Harris charlesr.harris@gmail....
Wed Jan 30 11:35:04 CST 2008


On Jan 30, 2008 10:10 AM, Charles R Harris <charlesr.harris@gmail.com>
wrote:

>
>
> On Jan 30, 2008 2:22 AM, Gael Varoquaux <gael.varoquaux@normalesup.org>
> wrote:
>
> > On Wed, Jan 30, 2008 at 12:49:44AM -0800, LB wrote:
> > > My problem is that the complexe calculations made in calc_0d use some
> > > parameters, which are currently defined at the head of my python file.
> > > This is not very nice and I can't define a module containing theses
> > > two functions and call them with different parameters.
> >
> > > I would like to make this cleaner and pass theses parameter as
> > > keyword  argument, but this don't seems to be possible with vectorize.
> > > Indeed, some of theses parameters are array parameters and only the x
> > > and y arguments should be interpreted with the broadcasting rules....
> >
> > > What is the "good way" for doing this ?
> >
> > I don't know what the "good way" is, but you can always use functional
> > programming style (Oh, no, CaML is getting on me !):
> >
> > def calc_0d_params(param1, param2, param3):
> >    def calc_0d(x, y):
> >        # Here your code making use of param1, param2, param3)
> >        ...
> >
> >    return calc_0d(x, y)
> >
> > you call the function like this:
> >
> > calc_0d_params(param1, param2, param3)(x, y)
> >
> > To vectorize it you can do:
> >
> > calc_0d_vect = lambda *params: vectorize(calc_0d_params(*params))
> >
> > This is untested code, but I hope you get the idea. It all about partial
> > evaluation of arguments. By the way, the parameters can now be keyword
> > arguments.
> >
>
> IIRC, the way to do closures in Python is something like
>
> In [5]: def factory(x) :
>    ...:     def f() :
>    ...:         print x
>    ...:     f.x = x
>    ...:     return f
>    ...:
>

Oops, looks like that needs to be:

In [5]: def factory(x) :
   ...:     def f() :
   ...:         print f.x
   ...:     f.x = x
   ...:     return f
   ...:

You can also do something simpler:

In [51]: def f() : print f.x
   ....:

In [52]: f.x = "Hello World!"

In [53]: f()
Hello World!

Chuck
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://projects.scipy.org/pipermail/numpy-discussion/attachments/20080130/8a1bcea2/attachment.html 


More information about the Numpy-discussion mailing list