2016-06-22 3 views
0

Ich möchte eine Funktion schreiben amap, die Build-in map ähnelt aber Unterstützung numpy Broadcast und Ausgabe-Array. Es würde so funktionieren:Eine Funktion ähnlich wie integrierte Karte, aber Unterstützung numpy broadcast

>>> amap(lambda x:x**2, 1) 
array(1) 
>>> amap(lambda x:x**2, [1, 2]) 
array([1, 4]) 
>>> amap(lambda x,y:y**2+x**2, 1, [1, 2]) 
array([2, 5]) 
>>> amap(lambda x,y:y**2+x**2, [1, 2], [[1], [2]]) 
array([[2, 5], [5, 8]]) 

Die übergebene Funktion arbeitet auf Skalar.

Ich habe eine Implementierung geschrieben.

def amap(func, *args): 
    '''array version of build-in map 
    amap(function, scalar/sequence[, ...]) -> array 
    ''' 
    args = np.broadcast(None, *args) 
    res = [func(*arg[1:]) for arg in args] 
    res = np.asarray(res).reshape(args.shape) 
    return res 

Es funktioniert, aber es ist irgendwie hässlich und nicht sehr effizient. Haben Sie irgendwelche guten Ideen, dies zu tun? Vor allem etwas mehr numply-stylish?

+0

Funktioniert die "Lambda" (Funktion) auf ganzen Arrays oder nur Skalaren? – hpaulj

+0

Welche Art von Effizienz erwarten Sie? Iterative Aufrufe mit Skalaren oder Array-Operationen? – hpaulj

+0

@hpaulj Die Funktion arbeitet nur mit Skalaren, in der Regel ist es eine komplexe Funktion und schwierig, ein Array zu betreiben. Ich dachte, mit einem zusätzlichen 'None' zu ​​senden und die Scheibe' arg [1:] 'zu machen, um' None' zu ​​löschen, ist weniger effizient. –

Antwort

0

Verwenden Sie numpy.vectorize direkt?

>>> numpy.vectorize(lambda x:x**2)(1) 
array(1) 
>>> numpy.vectorize(lambda x:x**2)([1,2]) 
array([1, 4]) 
>>> numpy.vectorize(lambda x, y: y**2 + x**2)(1, [1,2]) 
array([2, 5]) 
>>> numpy.vectorize(lambda x, y: y**2 + x**2)([1,2], [[1], [2]]) 
array([[2, 5], 
     [5, 8]]) 
+0

'vectorize' ist nicht effizient und intern ist es eher hässlich (d. H. Lang). – hpaulj

Verwandte Themen