Betrachten Sie die Liste der Listen l
Wenn ich dies in ein np.array
umwandle, bekomme ich ein eindimensionales Objekt-Array mit [1, 2, 3]
an der ersten Position und [1, 2]
an der zweiten Position.
Ich möchte das stattdessen
%Vor%Ich kann das mit einer Schleife machen, aber wir alle wissen, wie unpopulär Schleifen sind
%Vor%Wie mache ich das schnell und vektorisiert?
Timing
Setup-Funktionen
%Vor% %Vor% Dies scheint ein knappes this question
zu sein, bei dem die Auffüllung mit zeros
anstelle von% co_de erfolgte %. Interessante Ansätze wurden dort veröffentlicht, zusammen mit NaNs
basierend auf mine
und broadcasting
. Also, ich würde nur eine Zeile von meinem Post dort ändern, um diesen Fall so zu lösen -
Beispiellauf -
%Vor%Ich habe dort einige Laufzeit-Ergebnisse für alle geposteten Ansätze zu diesem Q & A geschrieben, die nützlich sein könnten.
Wahrscheinlich verwendet die schnellste Listenversion itertools.zip_longest
(kann izip_longest
in Py2 sein):
Die Ebene zip
erzeugt:
eine andere Zip 'transponiert':
%Vor%Wenn Sie mit Listen (oder sogar mit einem Objekt-Array von Listen) beginnen, ist es oft schneller, bei Listenmethoden zu bleiben. Beim Erstellen eines Arrays oder Datenrahmens ist ein erheblicher Aufwand erforderlich.
Dies ist nicht das erste Mal, dass diese Frage gestellt wurde.
Wie kann ich einen Vektor mit numpy auf eine bestimmte Länge auffüllen und / oder abschneiden?
Meine Antwort enthält sowohl dieses zip_longest
als auch dein box_pir
Ich denke, es gibt auch eine schnelle numpige Version, die ein flaches Array verwendet, aber ich erinnere mich nicht an die Details. Es wurde wahrscheinlich von Warren oder Divakar gegeben.
Ich denke, die "abgeflachte" Version funktioniert etwas entlang dieser Linie:
%Vor% erhalten plattered Indizes, wo Werte gehen. Dies ist der entscheidende Schritt. Hier ist die Verwendung von r_
iterativ; Die schnelle Version verwendet wahrscheinlich cumsum
=================
Der fehlende Link ist >np.arange()
sending
Ich könnte dies als eine Form der Slice-Zuweisung für jedes der Sub-Arrays schreiben, die mit einem Standard gefüllt wurden:
%Vor% Ich habe Divakars Boolesche Indizierung als f4
hinzugefügt und dem Timing-Test hinzugefügt. Zumindest bei meinen Tests (Python 2.7 und Python 3.5; Numpy 1.11) ist es nicht der schnellste.
Das Timing zeigt, dass izip_longest
oder f2
für die meisten Listen etwas schneller ist, aber die Slice-Zuweisung (das ist f1
) ist für größere Listen schneller:
Drucke:
%Vor%