10 svar
703 visningar
sussii 105 – Fd. Medlem
Postad: 22 maj 2018 18:15

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!

jek7 35 – Fd. Medlem
Postad: 22 maj 2018 19:02

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.

sussii 105 – Fd. Medlem
Postad: 22 maj 2018 20:07
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å?

Lindehaven 820 – Lärare
Postad: 22 maj 2018 21:57

Tror att jek7 menar:

lines = [line.strip().split(' ') for line in f if len(line) > 1]

sussii 105 – Fd. Medlem
Postad: 22 maj 2018 22:48
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å? 

Lindehaven 820 – Lärare
Postad: 23 maj 2018 11:50

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]

sussii 105 – Fd. Medlem
Postad: 23 maj 2018 13:43
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()

Lindehaven 820 – Lärare
Postad: 23 maj 2018 20:07

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.

sussii 105 – Fd. Medlem
Postad: 23 maj 2018 20:42
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.

Lindehaven 820 – Lärare
Postad: 24 maj 2018 00:34 Redigerad: 24 maj 2018 01:12

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.

Lindehaven 820 – Lärare
Postad: 25 maj 2018 03:45

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

Svara
Close