Seite 1 von 1

Tabellen - Zeilen gezielt einlesen und verarbeiten

Verfasst: Sonntag 21. Oktober 2012, 22:22
von degon
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

Re: Tabellen - Zeilen gezielt einlesen und verarbeiten

Verfasst: Montag 22. Oktober 2012, 23:06
von Sirius3
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

Re: Tabellen - Zeilen gezielt einlesen und verarbeiten

Verfasst: Montag 29. Oktober 2012, 17:01
von degon
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()

Re: Tabellen - Zeilen gezielt einlesen und verarbeiten

Verfasst: Montag 29. Oktober 2012, 17:48
von BlackJack
@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.

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])
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:

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()

Re: Tabellen - Zeilen gezielt einlesen und verarbeiten

Verfasst: Dienstag 30. Oktober 2012, 12:00
von degon
Hi BlackJack,

danke fuer den Tipp, nur das untere Beispiel geht noch nicht, ich probiere mal damit rum.