Hallo,
ich moechte Tabellenzeilen gezielt einlesen und verarbeiten. Folgende Applikation:
Jeweils 4 Zeilen lesen, diese Werte mitteln und anschliessend wieder 4 Zeilen lesen und mitteln.
Ich habe schon im Forum gesucht aber nichts gefunden, dabei meinte ich soetwas mal hier gesehen zu haben. Einlesen kann ich ueber numpy.genfromtxt, aber die weiterverarbeitung klappt nicht so wie ich mir das vorstelle. Kann mir jemand bitte Tipps geben?
Danke! Degon
Tabellen - Zeilen gezielt einlesen und verarbeiten
Hallo Degon,
es hilft uns sehr weiter, wenn Du das, was Du bereits gemacht hast, postest.
Falls es sich nicht um riesige Datenmengen handelt, kann numpy das mitteln über
jeweils vier Zeilen sehr viel effizienter mit reshape und mean.
Grüße
Sirius
es hilft uns sehr weiter, wenn Du das, was Du bereits gemacht hast, postest.
Falls es sich nicht um riesige Datenmengen handelt, kann numpy das mitteln über
jeweils vier Zeilen sehr viel effizienter mit reshape und mean.
Grüße
Sirius
So siehts bisher aus und funktioniert auch, aber geht das nicht eleganter?
Code: Alles auswählen
import numpy
import matplotlib.pyplot as plt
from scipy import fftpack
Filename = "8_gaq3_10372.5.txt"
DelayData = numpy.genfromtxt(Filename, usecols = 0)
TransientData = numpy.genfromtxt(Filename, usecols = 3)
LinesToAvg = 4
tempDelay = []
tempTransient = []
AvgDelay = []
AvgTransient = []
i = 0
j = 1
while i < len(DelayData):
tempDelay.append(DelayData[i])
tempTransient.append(TransientData[i])
if j == 4:
a = numpy.mean(tempDelay)
AvgDelay.append(a)
tempDelay = []
b = numpy.mean(tempTransient)
AvgTransient.append(b)
tempTransient = []
j = 0
i += 1
j += 1
print "Delay", AvgDelay
print "Transient", AvgTransient
plt.plot(AvgDelay, AvgTransient)
plt.show()
@degon: Ich glaube das kann man kaum *un*eleganter machen. Wenn man Python-Schleifen und Listen verwendet, kann man sich `numpy` auch sparen. Und dann auch noch ``while`` statt ``for``…
Lösungsansatz: Array-Form anpassen, so dass man ein Array mit den Dimensionen alte_länge/4 und 4 hat und dann über Dimension 1 den Durchschnitt bilden.
Zweimal die Eingabedaten lesen sollte man sich vielleicht auch sparen. Man kann die Daten gemeinsam einlesen und dann entweder im Speicher trennen, oder in einem 2D-Array belassen in ein 3D-Array umformen und dort den Mittelwert für beide Werte berechnen.
Edit: Ungetestet:
Lösungsansatz: Array-Form anpassen, so dass man ein Array mit den Dimensionen alte_länge/4 und 4 hat und dann über Dimension 1 den Durchschnitt bilden.
Code: Alles auswählen
In [464]: A = np.arange(20, dtype=float)
In [465]: A
Out[465]:
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.,
11., 12., 13., 14., 15., 16., 17., 18., 19.])
In [466]: A.shape = (len(A) / 4, 4)
In [467]: A
Out[467]:
array([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[ 12., 13., 14., 15.],
[ 16., 17., 18., 19.]])
In [468]: A.mean(1)
Out[468]: array([ 1.5, 5.5, 9.5, 13.5, 17.5])
Edit: Ungetestet:
Code: Alles auswählen
#!/usr/bin/env python
import numpy as np
from matplotlib import pyplot as plt
def main():
filename = '8_gaq3_10372.5.txt'
n = 4
data = np.loadtxt(filename, usecols=(0, 3))
assert len(data) % n == 0
data.shape = (len(data) // n, n, -1)
averaged_delay, averaged_transient = data.mean(1).transpose()
plt.plot(averaged_delay, averaged_transient)
plt.show()
if __name__ == '__main__':
main()