Странная ошибка питона - PullRequest
0 голосов
/ 16 марта 2010

Я пытаюсь написать программу на Python, которая вычисляет гистограмму, учитывая список чисел, таких как:

1
3
2
3
4
5
3.2
4
2
2

, поэтому входными параметрами являются имя файла и количество интервалов.

Код программы:

#!/usr/bin/env python
import os, sys, re, string, array, math
import numpy

Lista = []

db = sys.argv[1] 
db_file = open(db,"r")
ic=0
nintervals= int(sys.argv[2])

while 1:
    line = db_file.readline()
    if not line:
        break
    ll=string.split(line)
    #print ll[6]
    Lista.insert(ic,float(ll[0]))
    ic=ic+1

lmin=min(Lista)
print "min= ",lmin
lmax=max(Lista)
print "max= ",lmax

width=666.666
width=(lmax-lmin)/nintervals
print "width= ",width

nelements=len(Lista)
print "nelements= ",nelements
print " "
Histogram = numpy.zeros(shape=(nintervals))

for item in Lista:
    #print item
    int_number = 1 + int((item-lmin)/width)
    print " "
    print "item,lmin= ",item,lmin
    print "(item-lmin)/width= ",(item-lmin)," / ",width," ====== ",(float(item)-float(lmin))/float(width)
    print "int((item-lmin)/width)= ",int((item-lmin)/width) 
    print item , " belongs to interval ", int_number, " which is from ", lmin+width*(int_number-1), " to ",lmin+width*int_number
    Histogram[int_number] = Histogram[int_number] + 1

4

но почему-то я полностью потерялся, я получаю странные ошибки, кто-нибудь может помочь?

Спасибо

P.D. Вот результаты вывода:

item,lmin=  1.0 1.0
(item-lmin)/width=  0.0  /  0.666666666667  ======  0.0
int((item-lmin)/width)=  0
1.0  belongs to interval  1  which is from  1.0  to  1.66666666667

item,lmin=  2.0 1.0
(item-lmin)/width=  1.0  /  0.666666666667  ======  1.5
int((item-lmin)/width)=  1
2.0  belongs to interval  2  which is from  1.66666666667  to  2.33333333333

item,lmin=  3.0 1.0
(item-lmin)/width=  2.0  /  0.666666666667  ======  3.0
int((item-lmin)/width)=  3
3.0  belongs to interval  4  which is from  3.0  to  3.66666666667
Traceback (most recent call last):
  File "from_list_to_histogram.py", line 43, in <module>
    Histogram[int_number] = Histogram[int_number] + 1
IndexError: index out of bounds

Наиболее важные ошибки:

(item-lmin) / width = 1.0 / 0.666666666667 ====== 1,5

и

IndexError: индекс вне границ

Ответы [ 4 ]

1 голос
/ 17 марта 2010

Вот более Pythonic подход.

from itertools import groupby
from math import floor

data = [1,3,2,3,4,5,3.2,4,2,2,3.6]
data.sort()

nintervals = 3
lmax = max(data)
lmin = min(data)

width = 1.0*(lmax-lmin)/nintervals

def grouper(item):    
    return floor(1.0*(item-lmin)/width)

for i, b in groupby(data, grouper):
    print '%.3f <= i < %.3f ' %(lmin + i * width, lmin + (i+1) * width), list(b)
1 голос
/ 16 марта 2010

Я полагаю, что проблема может быть необычной в строке:

int_number = 1 + int((item-lmin)/width)

Почему это 1 +?Индексы Python для массива длины N включают от 0 до N-1.1 + здесь заставляет int_number переходить от 1 до 1 + (lmax-lmin)/width, т. Е. До 1 + nintervals, учитывая формулу для width, в то время как вы изменили размер от Histogram до nintervals элементов, так что это фактическидва, усугубляется 1 +, но он будет там (только для lmax) даже без него.сделайте интервалы на эпсилон шире, чтобы lmax упал внутри последнего, а не только за ним, и потерял 1 +, и все могло бы работать лучше.

0 голосов
/ 16 марта 2010

Я только что удалил код, который загружается из файла и переписывается во что-то более читаемое

from math import floor

Lista = [1,3,2,3,4,5,3.2,4,2,2]
ic=0
nintervals= 3

lmin=min(Lista)
print "min= ",lmin
lmax=max(Lista)
print "max= ",lmax

width=1.0*(lmax-lmin)/nintervals
print "width= ",width

nelements=len(Lista)
print "nelements= ",nelements
print " "
histogram =[0]*nintervals

for item in Lista:
    ind = int(floor(1.0*(item-lmin)/width))
    if ind==nintervals:
        ind=ind-1
    histogram[ind]+=1

for i,v in enumerate(histogram):
    print "from", lmin+i*width, "to", lmin+(i+1)*width, "are",v,"values"

for i,v in enumerate(histogram):
    print "Visual presentation:","="*int(round(v*40.0/lmax))
0 голосов
/ 16 марта 2010

В последней строке вы получаете доступ к гистограмме со слишком большим индексом. Вы должны убедиться, что int_number не более

len(Histogram) - 1

Вероятно, есть ошибка, которая вызывает эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...