In einer großen Code-Basis, ich np.broadcast_to
bin mit Arrays übertragen (nur einfache Beispiele hier verwenden):Un-Sende Numpy Arrays
In [1]: x = np.array([1,2,3])
In [2]: y = np.broadcast_to(x, (2,1,3))
In [3]: y.shape
Out[3]: (2, 1, 3)
An anderer Stelle im Code, ich Drittanbieter-Funktionen verwenden, die arbeiten können in einer vektorisierten Weise auf Numpy Arrays, aber das sind nicht ufuncs. Diese Funktionen verstehen das Broadcasting nicht, was bedeutet, dass das Aufrufen einer solchen Funktion für Arrays wie y
ineffizient ist. Lösungen wie Numpys vectorize
sind auch nicht gut, denn während sie Rundfunk verstehen, führen sie eine for
Schleife über die Array-Elemente ein, die dann sehr ineffizient ist.
Idealerweise möchte ich in der Lage sein, eine Funktion zu haben, die wir z. , die ein Array mit einer minimalen Form zurückgibt, das bei Bedarf wieder auf die volle Größe übertragen werden kann. So z.B .:
In [4]: z = unbroadcast(y)
In [5]: z.shape
Out[5]: (1, 1, 3)
Ich kann dann die Fremd Funktionen auf z
laufe, dann überträgt das Ergebnis zurück an y.shape
.
Gibt es eine Möglichkeit zu implementieren, die auf Numpys öffentlicher API basiert? Wenn nicht, gibt es irgendwelche Hacks, die das gewünschte Ergebnis bringen würden?
Etwas wie 'y [None, 0]'? – Divakar
Was meinst du mit "minimale Form"? Wird die minimale Form in N Dimensionen, die von 'unbroadcast' zurückgegeben wird, immer' (1, 1, ..., 1) '(oder sogar' (1,) ') sein? –
Ich meine die minimale Form, die immer noch alle erforderlichen Daten enthält, um sie an das vollständige Array zurückzusenden. Im obigen Beispiel ist '' z.shape' '' '(1,1,3)' 'not' '(1,1,1)' '. – astrofrog