Frage zu numpy.fromfunction

16/05/2011 - 14:22 von Enno Middelberg | Report spam
Hallo,


ich möchte ein numpy-Array mit einer Funktion füllen, aber der Funktion
neben den Array-Indizes noch zusàtzliche Parameter mitgeben:

zB:



def prod(a, b):
return a*b/c

array=numpy.fromfunction(prod, shape=(10,10))



In diesem Aufruf soll also die Funktion "prod" für jedes Element a*b/c
ausrechnen, wobei c irgendwie an die Funktion übergeben werden muß. Im
Moment löse ich das eher unelegant über



def prod(a, b):
global c
return a*b/c

c=5.0
array=numpy.fromfunction(prod, shape=(10,10))



Aber das sieht falsch und unelegant aus. Geht das besser?



Vielen Dank,

Enno
 

Lesen sie die antworten

#1 Peter Otten
16/05/2011 - 18:05 | Warnen spam
Enno Middelberg wrote:

ich möchte ein numpy-Array mit einer Funktion füllen, aber der Funktion
neben den Array-Indizes noch zusàtzliche Parameter mitgeben:

def prod(a, b):
return a*b/c

array=numpy.fromfunction(prod, shape=(10,10))

In diesem Aufruf soll also die Funktion "prod" für jedes Element a*b/c
ausrechnen, wobei c irgendwie an die Funktion übergeben werden muß. Im
Moment löse ich das eher unelegant über

def prod(a, b):
global c



c is automatisch global, solange Du der Variablen keinen neuen Wert zuweist,
die Deklaration daher überflüssig.

return a*b/c

c=5.0
array=numpy.fromfunction(prod, shape=(10,10))



Aber das sieht falsch und unelegant aus. Geht das besser?



Du kannst eine Funktion in einer Funktion erstellen. Die innere Funktion hat
dann (Lese-)Zugriff auf die Variablen der àußeren ("closure"):

import numpy
def make_prod(c):






... def prod(a, b):
... return a*b/c
... return prod
...
numpy.fromfunction(make_prod(5.0), shape=(3, 3))






array([[ 0. , 0. , 0. ],
[ 0. , 0.2, 0.4],
[ 0. , 0.4, 0.8]])

Oder Du verwendest functools.partial():

from functools import partial
def prod(a, b, c):






... return a*b/c
...
numpy.fromfunction(partial(prod, c=2.0), shape=(3, 3))






array([[ 0. , 0. , 0. ],
[ 0. , 0.5, 1. ],
[ 0. , 1. , 2. ]])

Schließlich, der Vollstàndigkeit halber, ein "callable object":

class Prod(object):






... def __init__(self, c):
... self.c = c
... def __call__(self, a, b):
... return a*b/self.c
...
numpy.fromfunction(Prod(3.0), shape=(3, 3))






array([[ 0. , 0. , 0. ],
[ 0. , 0.33333333, 0.66666667],
[ 0. , 0.66666667, 1.33333333]])

Ähnliche fragen