Die beste Methode, um ein NumPy-Array aus einem Wörterbuch zu erstellen?

8

Ich beginne gerade mit NumPy, so dass mir einige Kernkonzepte fehlen könnten ...

Was ist der beste Weg, ein NumPy-Array aus einem Wörterbuch zu erstellen, dessen Werte Listen sind?

In etwa so:

%Vor%

Sollte zu etwas wie:

werden %Vor%

Ich werde einige grundlegende Statistiken zu jeder Zeile machen, zB:

%Vor%

Fragen:

  • Was ist die beste / effizienteste Methode, um numpy.array aus dem Wörterbuch zu erstellen? Das Wörterbuch ist groß; ein paar Millionen Schlüssel mit jeweils ~ 20 Elementen.

  • Die Anzahl der Werte für jede 'Zeile' ist unterschiedlich. Wenn ich richtig verstehe, will numpy einheitliche Größe, also was fülle ich für die fehlenden Items aus, um std () glücklich zu machen?

Update: Eine Sache, die ich vergessen habe zu erwähnen - während die Python-Techniken vernünftig sind (z. B. das Umgehen von einigen Millionen Elementen ist schnell), ist es auf eine einzige CPU beschränkt. Numpy-Operationen skalieren schön zur Hardware und treffen alle CPUs, also sind sie attraktiv.

    
Parand 02.03.2009, 06:57
quelle

3 Antworten

8

Sie müssen keine numpy Arrays erstellen, um numpy.std () aufzurufen. Sie können numpy.std () in einer Schleife über alle Werte Ihres Wörterbuchs aufrufen. Die Liste wird im laufenden Betrieb in ein numpliges Array konvertiert, um die Standardvariation zu berechnen.

Der Nachteil dieser Methode ist, dass die Hauptschleife in Python und nicht in C liegt. Aber ich denke, das sollte schnell genug sein: Sie werden immer noch std mit C-Geschwindigkeit berechnen, und Sie werden viel Speicher wie Sie speichern muss 0 Werte nicht speichern, wo Sie Arrays variabler Größe haben.

  • Wenn Sie dies weiter optimieren möchten, können Sie Ihre Werte in einer Liste von numply Arrays speichern, so dass Sie die Python-Liste tun - & gt; Numpy-Array-Konvertierung nur einmal.
  • Wenn Sie feststellen, dass dies immer noch zu langsam ist, versuchen Sie, mit psycho die Pythonschleife zu optimieren.
  • Wenn dies immer noch zu langsam ist, versuchen Sie Cython zusammen mit dem numpy-Modul. Dieses Tutorial bietet beeindruckende Geschwindigkeitsverbesserungen für die Bildverarbeitung. Oder programmieren Sie einfach die gesamte Std-Funktion in Cython (siehe dies für Benchmarks und Beispiele mit Summenfunktion)
  • Eine Alternative zu Cython wäre SWIG mit numpy.i .
  • Wenn Sie nur numpy verwenden und alles auf C-Ebene berechnen lassen möchten, versuchen Sie, alle Datensätze derselben Größe in verschiedenen Arrays zu gruppieren, und rufen Sie numpy.std () auf jeder Ebene auf. Es sollte wie im folgenden Beispiel aussehen.

Beispiel mit O (N) -Komplexität:

%Vor%     
Mapad 03.03.2009, 15:15
quelle
2

Obwohl hier bereits einige ziemlich vernünftige Ideen vorhanden sind, halte ich folgendes für erwähnenswert:

Das Füllen fehlender Daten mit einem beliebigen Standardwert würde die statistischen Eigenschaften (Std. usw.) beeinträchtigen. Offensichtlich hat Mapad deshalb den netten Trick vorgeschlagen, gleich große Datensätze zu gruppieren. Das Problem damit (vorausgesetzt, es gibt keine A-priori-Daten zu Datensatzlängen ist in der Nähe) ist, dass es noch mehr Berechnungen als die einfache Lösung beinhaltet:

  1. mindestens O (N * logN) 'len' Aufrufe und Vergleiche zum Sortieren mit einem effektiven Algorithmus
  2. O (N) prüft auf dem zweiten Weg durch die Liste, um Gruppen zu erhalten (ihre Anfangs- und Endindizes auf der 'vertikalen' Achse)

Die Verwendung von Psyco ist eine gute Idee (es ist auffallend einfach zu benutzen, also versuch es einfach).

Es scheint, dass der optimale Weg darin besteht, die in Maplet 1 beschriebene Strategie zu verwenden, aber mit einer Modifikation - nicht die ganze Liste zu generieren, sondern das Wörterbuch zu durchlaufen, indem jede Zeile in numpy.array konvertiert und die erforderlichen Berechnungen durchgeführt werden . So:

%Vor%

In jedem Fall werden ein paar Millionen Schleifen in Python nicht so lange dauern, wie man erwarten könnte. Außerdem sieht das nicht wie eine Routineberechnung aus, also wen interessiert es, wenn es eine zusätzliche Sekunde / Minute braucht, wenn es einmal oder sogar nur einmal ausgeführt wird.

Eine verallgemeinerte Variante dessen, was von Mapad vorgeschlagen wurde:

%Vor%     
Maleev 08.03.2009 11:06
quelle
0

numpiges Wörterbuch

Sie können ein strukturiertes Array verwenden, um die Fähigkeit zu erhalten, ein anonymer Gegenstand mit einem Schlüssel wie einem Wörterbuch zu adressieren.

%Vor%

gibt jetzt

aus %Vor%     
Davoud Taghawi-Nejad 23.07.2012 20:11
quelle

Tags und Links