Betrachten Sie das folgende Beispiel in Python 2.7. Wir haben eine beliebige Funktion f()
, die zwei eindimensionale numpy Arrays zurückgibt. Beachten Sie, dass f()
im Allgemeinen Arrays unterschiedlicher Größe zurückgeben kann und dass die Größe von der Eingabe abhängen kann.Erstellen von zwei verketteten Arrays aus einem Generator
Jetzt möchten wir map
auf f()
aufrufen und die Ergebnisse in zwei separate neue Arrays verketten.
import numpy as np
def f(x):
return np.arange(x),np.ones(x,dtype=int)
inputs = np.arange(1,10)
result = map(f,inputs)
x = np.concatenate([i[0] for i in result])
y = np.concatenate([i[1] for i in result])
Dies ergibt das beabsichtigte Ergebnis. Da das Ergebnis jedoch viel Speicher belegen kann, ist es möglicherweise vorzuziehen, einen Generator zu verwenden, indem Sie imap
statt map
aufrufen.
from itertools import imap
result = imap(f,inputs)
x = np.concatenate([i[0] for i in result])
y = np.concatenate([i[1] for i in result])
jedoch ergibt dies einen Fehler, da der Generator an der Stelle leer ist, wo wir y
berechnen.
Gibt es eine Möglichkeit, den Generator nur einmal zu verwenden und immer noch diese beiden verketteten Arrays zu erstellen? Ich suche nach einer Lösung ohne eine for-Schleife, da es ziemlich ineffizient ist, Arrays wiederholt zu verketten/anzufügen.
Vielen Dank im Voraus.
Haben Sie bedeuten, dass 'i [0]' und 'i [1]' verschiedene Formen haben kann? –
@SergeiLebedev Im Allgemeinen ja. In meinem Beispiel haben sie die gleiche Form. – Forzaa
Ich sehe nicht den Vorteil der Verwendung eines Generators für "Ergebnis". Sie erstellen für den Aufruf "np.concatenate" noch zwei Listen gleicher Größe wie "result". Wenn also zwei Listen zulässig sind, können Sie einfach in einer For-Schleife über 'result' iterieren und die Listen gleichzeitig aktualisieren. –