2016-07-25 8 views
0

Ich versuche, die folgende Funktion auf das Argument vektorisieren tiling:Python functools.partial mit fester Anordnung bewertet Argument

def find_tile(x,tiling): 
    """ 
    Calculates the index of the closest element of 'tiling' to 'x'. 
    tiling: array of grid positions 
    x: variable of the same type as the elements of tiling 
    """ 
    return np.argmin(np.linalg.norm(tiling - x, axis=1)) 

Zum Beispiel kann die nicht-vektorisierte Version der Funktion kann die folgenden Argumente akzeptiert

tiling = np.array([[i,j] for i in xrange(3) for j in xrange(3)]) 
x = np.array([1.2, 2.7]) 

ich habe Interesse an den schnellstmöglichen Vektorisierung zu finden, so dass x ein einzelner Vektor bleibt und ich kann eine Liste von Argumenten übergeben tiling

Also versuchte ich mehrere Pflasterungen mit einem Generator definieren:

tilings = (tiling + np.random.uniform(0,1,2) for j in xrange(3)) 

und dann mit map und functools.partial:

map(functools.partial(find_tile, x=x), tilings) 

Anscheinend gibt es ein Problem mit x ist ein Array oder etwas, da ich bin Fehler bekommen:

Kann mir jemand erklären wie man ge t um es herum?

Auch ist es eine Alternative und schneller Weg, um dies (möglicherweise Umschreiben die Funktion find_tile?) Zu tun

Antwort

1

Du in x als Stichwort Argument übergeben. map() geht in jedem Element von tilings in als Positionsargument über. Da jedoch Ihr erstes Positionsargument x ist, stößt das an das Schlüsselwortargument. Die Verwendung eines Namens als Schlüsselwort-Argument verhindert nicht, dass derselbe Name mit einem Positionsargument gefüllt wird.

Verwenden Sie kein Schlüsselwortargument für x; gibt es nur in als Positions Argument partial():

map(functools.partial(find_tile, x), tilings) 

Jetzt jedes Element von tilings in als zweites Positions Argument übergeben wird und der Aufruf funktioniert.

Verwandte Themen