file_1.dat, file_2.dat ...... Dies ist eine Methode zum Lesen einer Datendatei wie file_100.dat, bei der sich nur die Zahlen mithilfe der for-Anweisung kontinuierlich ändern, verarbeiten und grafisch darstellen. Ich konnte keine zusammenhängende Erklärung finden, deshalb werde ich sie als Memorandum belassen.
Es gibt Dutzende von Datendateien mit n Zeilen und 2 Spalten wie diese, und ich möchte nur die Werte in der zweiten Spalte extrahieren, berechnen und grafisch darstellen. Wenn Sie jeweils eine Datei kopieren und in Excel einfügen, ist viel Zeit und Mühe erforderlich.
Ursprünglich war es ein Programm, das jede Datei las, verarbeitete, den x-, y-Werten zuwies usw.
data_number_1,data_intensity_1 = np.loadtxt("file_1.dat",unpack = True)
s1 = su(data_intensity_1)
m1 = mean(data_intensity_1)
x=[s1]
y=[m1]
Es war ein Programm, das dies für die Anzahl der Dateien wiederholte, was eine lächerlich große Anzahl von Zeilen und Volumes war, aber wie eingangs erwähnt, unterscheiden sich die Dateinamen nur im Zahlenteil, so dass es einfach ist, die for-Anweisung in Python zu verwenden. Kann es verarbeitet werden? Das war die Motivation, über das Programm nachzudenken.
Verwenden Sie np.loadtext, um die Datendatei zu laden. Referenz: https://deepage.net/features/numpy-loadsavetxt.html
Der zum Laden verwendete Beispielcode lautet wie folgt. Hierbei wird davon ausgegangen, dass die Seriennummerndateien von Datei_1 bis Datei_20 gelesen werden.
data = []
for i in range(1,21):
data.append(np.loadtxt("file_{}.dat".format(i),usecols=(1),unpack=True))
Der Code wird unten Schritt für Schritt erklärt.
Wenn Sie den Bereich von i in der for-Anweisung festlegen, wird der Bereich von ** Maximalwert-1 ** angewendet. Setzen Sie diesmal den Bereich als (1,21) als Dateinummer 20 + 1.
Da der Dateiname file_ ** number **. Dat ist, verwenden Sie die Formatierungsmethode und führen Sie sie als ** file_ {} .dat ".format (i) ** aus. Auf diese Weise kann eine Schleifenverarbeitung wie file_1.dat, file_2.dat ... durchgeführt werden.
Dann wird der Wert des Prozesses, der von ** data.append ** wiederholt wird, zu der Liste hinzugefügt, die als Daten bezeichnet wird, die diese erstellt haben, und so weiter.
Von der Dat-Datei möchte ich nur den Wert in der zweiten Zeile als numerischen Wert behandeln, daher muss ich die Verarbeitung dafür hinzufügen.
Wenn Sie den numerischen Wert so wie er ist mit Loadtext lesen, wird er zeilenweise in die Liste eingefügt, z. B. [0.0 72925], [1.0 70740] ... [10.0 73343] im Beispiel des vorherigen Bildes.
Also verwende ich ** entpacken **, um es zu transponieren und für jede Spalte in eine andere Variable zu setzen. Wenn Sie den Wert auf True setzen, erfolgt eine Translokation, und die Liste kann für jede Spalte unterschiedliche Variablen enthalten, z. B. [0.0 1.0 ... 10.0], [72925 70740 ... 73343].
Da wir nur die zweite Spalte als numerischen Wert behandeln möchten, ohne die erste Spalte zu verwenden, geben Sie die Zeile an, die von ** usecols ** gelesen werden soll. Da wir entschieden haben, welche Zeile 0 als erste Zeile lesen soll, müssen wir dies beim Lesen der zweiten Spalte als (** 1 **) tun. Auf diese Weise enthält die Datenliste nur [72925 70740 ... 73343].
Einzelheiten finden Sie auf der oben angegebenen Referenzseite. Durch die Verwendung von Unpack und Usecols auf diese Weise konnte ich nur die zweite Spalte in eine Variable für jede Datei einfügen.
data = [2. Spalte von Datei_1, 2. Spalte von Datei_2, ..., 2. Spalte von Datei_20].
Im ursprünglichen Programm wurde nur das in den Dateizweig eingegeben! Die Anzahl der Zeilen und die Anzahl der Zeichen sind überraschend reduziert. Je mehr Dateien Sie haben, desto einfacher wird es natürlich.
Auf diese Weise konnten wir alle Dateisätze nur für den Wert in der zweiten Zeile erfassen. Als Nächstes werden wir jeden einzelnen verarbeiten. Um die Werte in der Liste stapelweise zu verarbeiten, definieren Sie eine Funktion und verarbeiten Sie sie der Reihe nach.
Nehmen wir diesmal an, dass die horizontale Achse die Summe der Werte für jede Datei und die vertikale Achse der Durchschnittswert ist.
Jede Funktionsdefinition kann wie folgt geschrieben werden.
def su(a):
return np.sum(a)
def mean(a):
return np.mean(a)
Wenden Sie diese Prozesse einzeln auf die Listendaten an.
for i in range(1,21):
si = su(data[i-1])
mi = mean(data[i-1])
Eine Sache, die hier zu beachten ist, ist der Bereichswert. Die Dateinamen beginnen bei 1, aber die Listenwerte beginnen bei 0. Wenn Sie den Wert von i in der Funktion angeben, müssen Sie ihn daher als ** (i-1) ** ausführen.
Dies bedeutet, dass Sie den Wert, den Sie für 1 bis 20 halten, im Bereich von 0 bis 19 einstellen müssen.
Ich werde diesmal die ausführliche Erklärung weglassen. Wenn Sie mit matplotrib suchen, finden Sie verschiedene Erklärungen.
Es ist notwendig, die durch das obige Verarbeitungsverfahren berechneten Werte als x bzw. y einzustellen. Erstellen Sie daher eine Liste auf die gleiche Weise wie beim Lesen einer Datei und fügen Sie die verarbeiteten Werte der Reihe nach in die x, y-Liste ein.
x=[]
y=[]
for i in range(1,21):
si = sum(data[i-1])
mi = mean(data[i-1])
x.append(si)
y.append(mi)
Auf diese Weise konnten wir die Werte für die x-Achse und die y-Achse vorbereiten. Der Rest wird durch Erstellen eines Diagramms mithilfe eines Diagramms abgeschlossen.
Basierend auf dem oben Gesagten ist der gesamte Code wie folgt. (Werte, Dateien und Grafiken werden als Beispiele erstellt und haben keine Bedeutung.)
import numpy as np
import matplotlib.pyplot as plt
def su(a):
return np.sum(a)
def mean(a):
return np.mean(a)
data = []
for i in range(1,21):
data.append(np.loadtxt("file_{}.dat".format(i),usecols=(1),unpack=True))
x=[]
y=[]
for i in range(1,21):
si = su(data[i-1])
mi = mean(data[i-1])
x.append(si)
y.append(mi)
plt.plot(x,y,ls="",marker="o");
plt.xlim(xmin=0)
plt.ylim(ymin=0)
plt.show()
Durch die Verwendung der Schleifenverarbeitung auf diese Weise ist es uns gelungen, mehr als 100 Zeilen zu vereinfachen, und die Effizienz hat sich dramatisch verbessert! Ich hoffe, es ist hilfreich für diejenigen, die unter ähnlichen Problemen leiden.
Danke fürs Lesen.
Recommended Posts