konvertiert die unebene Liste der Listen effizient in ein minimales Array, das mit nan aufgefüllt ist

8

Betrachten Sie die Liste der Listen l

%Vor%

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.

%Vor%

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%     
piRSquared 13.11.2016, 00:25
quelle

4 Antworten

6

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 -

%Vor%

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.

    
Divakar 13.11.2016, 07:15
quelle
3

Wahrscheinlich verwendet die schnellste Listenversion itertools.zip_longest (kann izip_longest in Py2 sein):

%Vor%

Die Ebene zip erzeugt:

%Vor%

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

%Vor%

=================

Der fehlende Link ist >np.arange() sending

%Vor%     
hpaulj 13.11.2016 03:21
quelle
2

Vielleicht so etwas? Ich weiß nichts über Ihre Hardware, aber bedeutet bei 16ms für 100 Schleifen für l2 = [Liste (Bereich (20)), Liste (Bereich (30))] * 10000.

%Vor%     
Simon 13.11.2016 00:59
quelle
1

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:

%Vor%

Drucke:

%Vor%     
dawg 13.11.2016 03:12
quelle

Tags und Links