Tabellen - Zeilen gezielt einlesen und verarbeiten

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
degon
User
Beiträge: 28
Registriert: Montag 14. Juni 2010, 12:03

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
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

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
degon
User
Beiträge: 28
Registriert: Montag 14. Juni 2010, 12:03

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()
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()
degon
User
Beiträge: 28
Registriert: Montag 14. Juni 2010, 12:03

Hi BlackJack,

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