Vektor auf Tabelle abbilden?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Matthias Moritz
User
Beiträge: 2
Registriert: Donnerstag 4. April 2013, 13:54
Wohnort: München
Kontaktdaten:

Guten Tag,

Ich einen großen Haufen Messdaten, die ich auswerten möchte. Im Grunde genommen liegen die Daten als eine Liste von Tupel (f, V, Z) vor.
Diese möchte ich auf eine Tabelle abbilden um sie dann später plotten zu können. Die Tabelle sollte dabei in etwa so aussehen:

Code: Alles auswählen

     |  V_1  |  V_2  |  V_3 ...
-----------------------------
f_1  |  Z_11 |       |
f_2  |  Z_21 |       | Z_23 
  .
  .
  .
Dabei können durchaus einige Felder in der Tabelle leer sein. Man könnte das Problem auch als einen Full Outer Join über mehrere Tabellen auffassen (so viele, wie es verschiedene V-Werte in den Daten gibt).

Jetzt könnte ich natürlich eine Liste mit allen f-Werten und allen V-Werten erstellen und dann über diese Iterieren und in eine Liste die Z-Werte (wenn vorhanden) eintragen. Oder aber ich erstelle mir mit sqlite eine Datenbank mit den entsprechenden Tabellen und mache einen den Join. Ich hab dabei nur das Problem, dass die Datenmenge recht groß ist (Die Vektoren sind über mehrere Dateien verteilt und belegen rund 100MB, ich hab nie gezählt wie viele es wirklich sind).

Wie würdet ihr das machen? Hat jemand eine Idee für einen effizienten Algorithmus oder sind meine Ansätze schon die richtigen?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo Matthias,
kannst Du die Art der Daten noch näher beschreiben?
Wie viele unterschiedliche V bzw. f gibt es und sind sie äquidistant?
Wenn die Daten weiter verrechnet werden sollen, dann bietet sich natürlich eine numpy Matrix an.
Bei den paar Zahlen dürfte das das effizienteste und schnellste sein.

Um schnell den Index für die Matrix aus V bzw. f zu ermitteln hilft dir unique:

Code: Alles auswählen

def convert_to_matrix(f,V,Z):
    "f,V,Z are vectors of same length"
    f_uni, f_idx = numpy.unique(f, return_inverse=True)
    V_uni, V_idx = numpy.unique(f, return_inverse=True)
    Z_mat = numpy.ndarray(shape=(len(V_uni), len(f_uni))
    Z_mat.fill(numpy.NaN)
    Z_mat[V_uni,f_uni]=Z
    return f_uni, V_uni, Z_mat
Grüße Sirius
Matthias Moritz
User
Beiträge: 2
Registriert: Donnerstag 4. April 2013, 13:54
Wohnort: München
Kontaktdaten:

Hallo Sirius,

Es geht ja darum Messdaten auszuwerten und Entsprechend kommt es stark auf die Messung an wie die Daten jetzt genau aussehen. Grundsätzlich kann man sagen, dass die Anzahl der f und V Werte vorher festgelegt sind, gemessen wird nur die Impedanz Z. Wie viele Werte f und V es gibt lässt sich nicht pauschal sagen, aber für V sind es maximal 100. Für die f-Werte... Sehr viele.
In der Regel (aber nicht auf jeden Fall) sind die V-Werte äquidistant und die f-Werte sind (meist, aber nicht zwingend) logarithmisch äquidistant.

Danke für das Snippet. Ich schau mir das mal in Ruhe an.
Antworten