Medelvärde
Hej, jag behöver lite hjälp med att skriva kod. Jag har en textfil där den innehåller antal sönderfall per sekund.
Jag vill göra en stapeldiagram över fördelningen av antal sönderfall per 5 sekundsintervall och beräkna samt ange medelvärdet och plotta i samma diagram den poissonfördelning, normaliserad till antalet händelser i diagrammet, som har detta medelvärde.
Förstår inte riktigt hur jag ska göra och uppskattar all hjälp som jag kan få.
Jag tänkte börja såhär:
import numpy as np
from spicy.stats import poisson
from matplotlib import pyplot as plt
Jag tänker att nu vill vi hämta data ifrån textfilen (textfilen heter backgroundb):
with open('backgroundb.txt') as f:
lines = [line.strip().split(': ') for line in f if len(line) > 1]
labels, y = zip(*lines)
ind = np.arange(len(labels))
plt.figure()
plt.bar(ind, y, align='center')
plt.xticks(ind, labels)
plt.show()
Men, det står "not enough values to unpack (expected 2, got 1)"
Textfilen innehåller:
0 5
1 10
2 1
3 2
4 8
5 1
6 4
7 6
8 1
9 3
(innehåller mer värden men ville bara visa här hur det ser ut)
Jag har textfilen i skrivbordet och jag vet inte om det beror på det och jag vet inte hur jag ska fortsätta härifrån om det här är rätt.
All hjälp uppskattas!
Tack på förhand!
Textfilen har bara mellanslag som fältavskiljare, men du gör split på ": " på rad ~5.
Då blir det ingen split, och varje position i lines-listan har bara ett item och inte två, och zip(*lines) returnerar därmed en lista och inte två, och ger felet du får.
Så splitta på (" ") så borde du komma längre.
jek7 skrev:Textfilen har bara mellanslag som fältavskiljare, men du gör split på ": " på rad ~5.
Då blir det ingen split, och varje position i lines-listan har bara ett item och inte två, och zip(*lines) returnerar därmed en lista och inte två, och ger felet du får.
Så splitta på (" ") så borde du komma längre.
with open('backgroundb.txt') as f:
lines = [line.strip().split(' , ') for line in f if len(line) > 1]
Menar du kanske så här? Förstår inte riktigt :/
Behöver jag lägga till något till zip(*lines) så att den returnerar två?
Tror att jek7 menar:
lines = [line.strip().split(' ') for line in f if len(line) > 1]
Lindehaven skrev:Tror att jek7 menar:
lines = [line.strip().split(' ') for line in f if len(line) > 1]
Nu har jag ändrat det, tack! Men jag får fortfarande not enough values to unpack (expected 2, got 1).
Hur gör jag då?
Kanske du har annat än mellanslag som separerar värdena i filen? Prova split utan argument så delar den på alla "whitespace":
lines = [line.strip().split() for line in f if len(line) > 1]
Lindehaven skrev:Kanske du har annat än mellanslag som separerar värdena i filen? Prova split utan argument så delar den på alla "whitespace":
lines = [line.strip().split() for line in f if len(line) > 1]
Får fortfarande samma error:
Traceback (most recent call last):
File "C:\Users\sibel\Desktop\labb.py", line 8, in <module>
labels, y=zip(*lines)
ValueError: not enough values to unpack (expected 2, got 1)
Koden ser så här ut just nu:
import numpy as np
from scipy.stats import poisson
from matplotlib import pyplot as plt
with open('backgroundb.txt') as f:
lines =[line.strip().split() for line in f if len(line)>1]
labels, y=zip(*lines)
ind=np.arange(len(labels))
plt.figure()
plt.bar(ind, y, align='center')
plt.xticks(ind, labels)
plt.show()
Vet inte varför det blir fel och kan inte prova själv för jag är inte vid någon dator. Du får försöka hitta det med hjälp av brytpunkter och utskrifter.
Lindehaven skrev:Vet inte varför det blir fel och kan inte prova själv för jag är inte vid någon dator. Du får försöka hitta det med hjälp av brytpunkter och utskrifter.
Om man tittar på felet så står det line 8 : labels, y=zip(*lines) så jag antar att det är det här som är fel. Men vet inte hur jag ska lösa problemet.
Detta är inte ett syntaxfel och då kan felet ha introducerats på någon eller några rader innan det blir synligt. Så stirra dig inte blind på just den raden. Använd IDLE (eller ngn annan debugger) och sätt brytpunkter. Stega igenom koden rad för rad och se på datat.
Följande kod fungerar :
with open('backgroundb.txt') as f:
lines = [line.strip().split() for line in f if len(line) > 1]
labels,y = zip(*lines)
Har du sparat och kört rätt version av din kod?
Har du kontrollerat att alla värden i 'backgroundb.txt' separerats med mellanslagstecken (SPC) eller tabulatortecken (TAB)?