Datei spaltenweise lesen

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.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Marie hat geschrieben:Vielen Dank pillmuncher,
Gern geschehen.

Das hier allerdings ist nicht besonders:
Marie hat geschrieben:

Code: Alles auswählen

    for i in range(len(csvdata)):
        data1 =  csvdata[i][0] #first row, first col
        data2 = csvdata[i][3]
Lieber so:

Code: Alles auswählen

    for row in csvdata:
        data1 = row[0] #first row, first col
        data2 = row[3]
In specifications, Murphy's Law supersedes Ohm's.
Marie
User
Beiträge: 35
Registriert: Freitag 25. November 2011, 15:22

Danke pillmuncher,

ich habe mich eigentlich verschrieben der kommen lautet
first column
. ich wiil auf die erste Spalte zugereifen.

nun habe ich leider ein neues Problem.

Code: Alles auswählen


from numpy import *
from scipy.optimize import leastsq
from math import *
import matplotlib.pyplot as plt
import numpy as np
import csv


data_mat = []
time_array = []
data_array =[]
with open('file.txt', 'rb') as csvfile:
    reader = csv.reader(csvfile, delimiter='\t')
    next(reader) #header-Zeile ignorieren
    csvdata = [
        [int(row[0])] + [float(value.replace(',', '.')) for value in row[1:]]
            for row in reader if row
    ]
    
for i in range(len(csvdata)):
    data1 =  csvdata[i][0] #first col
    data2 = csvdata[i][3]
    time_array.append(float(data1))
    data_array.append(float(data2))

y = data_array
x = time_array
A1_0=4
A2_0=3
k1_0=0.5
k2_0=0.04
n1_0=2
n2_0=1
pname = (['A1','A2','k1','k2','n1','n2'])
p0 = array([A1_0 , A2_0, k1_0, k2_0,n1_0,n2_0])
""" Data plotten"""
def plot(x, y):
    line, = plt.plot(x,y, lw=2)
    plt.show()
    
def residuals(p, y, x):
    err = y-peval(x,p)
    return err
def peval(x, p):
    return p[0]*(1-np.exp(-(p[2]*x)**p[4])) + p[1]*(1- np.exp(-(p[3]*(x))**p[5] ))

plsq = leastsq(residuals, p0, args=(y, x), maxfev=2000)
ich bekomme dann ein Fehelrmeldung, die so lautet:

Code: Alles auswählen

err = y-peval(x,p)
ValueError: shape mismatch: objects cannot be broadcast to a single shape
irgendweilche Vorschläger wie ich das lösen könnte?
Danke im Voraus
LG
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Die Fehlermeldung sagt aus, dass ``y`` und das Ergebnis von ``peveal(x, p)`` verschiedene Dimensionen haben. Lass dir beide Werte mal ausgeben, dann siehst du das Problem.
Das Leben ist wie ein Tennisball.
Marie
User
Beiträge: 35
Registriert: Freitag 25. November 2011, 15:22

Danke EyDu für die Antwort,

ich glaube die Lösung ist einfach die beiden Array als numpy array auszugeben

Code: Alles auswählen

y = np.array(data_array)
x = np.array(time_array)
jetzt ist der Fehler verschwunden.
Danke für eure Tipps und Hilfe
LG
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

@Marie: Wenn du sowieso NumPy benutzt, bietet sich auch an dieses direkt zum Einlesen der Daten zu verwenden. Da du Kommas verwendest muss man leider noch einen Konverter definieren. Grundsätzlich würde ich es empfehlen immer einen Punkt zu verwenden.

Code: Alles auswählen

In [34]: import numpy as np

In [35]: def float2(s):
   ....:     return float(s.replace(',','.'))
   ....: 

In [36]: converters = {0: float2, 1: float2, 2: float2, 3: float2}

In [37]: data = np.loadtxt('test.dat', skiprows=1, converters=converters)

In [38]: data
Out[38]: 
array([[  12.    ,  200.9673,   14.4022,   11.9805],
       [   6.    ,   33.9673,   18.4022,   23.9805],
       [  24.    ,   72.9673,   32.4022,   44.9805],
       [  22.    ,   98.9673,   55.4022,   76.9805]])
Grüße
Gerrit

PS: Die *-Importe in deinem Code sind sehr gefährlich, weil Funktionen aus "numpy" von "math" Funktionen überschrieben werden. Die "math" Funktionen können allerdings nicht mit numpy arrays umgehen, wodurch du früher oder später "seltsame" Fehlermeldungen bekommst.

PPS: Sei dir bewusst das "y = data_array" keine Kopie von "data_array" an "y" gebunden wird!
Marie
User
Beiträge: 35
Registriert: Freitag 25. November 2011, 15:22

Nun habe ich leider ein neuer Fehler drin:( ist mein Code eigentlich einiger maßen richtig?

Code: Alles auswählen

    return p[0]*(1-np.exp(-(p[2]*x)**p[4])) + p[1]*(1- np.exp(-(p[3]*(x))**p[5] ))
    TypeError: 'int' object is unsubscriptable
wisst ihr woran das liegt ?
Marie
User
Beiträge: 35
Registriert: Freitag 25. November 2011, 15:22

PPS: Sei dir bewusst das "y = data_array" keine Kopie von "data_array" an "y" gebunden wird!
wie kann ich der Inhalt in einem anderen Array speichern?

schau hier ein Bsp von Python-Seite:

Code: Alles auswählen

t = numpy.array([67., 88, 104, 127, 138, 160, 169, 188, 196, 215, 240, 247, 271, 278, 303, 305, 321, 337, 353])
in meinem fall ist dann:

Code: Alles auswählen

y = np.array(data_array)
soll das nicht das gleiche sein?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du wendest [] auf einen Integer an. Lass dir doch einfach mal die Variablen ausgeben und frage nicht sofort wegen jeder Kleinigkeit nach.
Das Leben ist wie ein Tennisball.
Marie
User
Beiträge: 35
Registriert: Freitag 25. November 2011, 15:22

EyDu wenn Du nicht antworten willst, dann antworte nicht. Vielleicht wollen andere mir helfen.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@Marie: Debuggen must du schon selber. Wenn du wie wild versuchst irgendwelche Variablen zu indizieren und es nichtmal fertigbringst, selber ein paar print-Statements in deinen Code einzubauen um nachzusehen wo das Problem liegen könnte, dann wird uns hier auch sehr bald die Lust vergehen, dir zu helfen.
In specifications, Murphy's Law supersedes Ohm's.
Antworten