2010-03-16 231 views
-1

我想写计算直方图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 

但不知何故,我完全失去了,我得到奇怪的错误,有谁能够help¿

感谢

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 

最重要的错误是:

(项目-lmin工)/宽度= 1.0/0.666666666667 ====== 1.5

IndexError:索引超出范围

+6

你会得到什么错误? – Uri 2010-03-16 19:42:29

+1

切勿使用'while 1:f.readline()'。在f:中使用'for line。 – 2010-03-16 20:06:51

+1

请勿使用'string.split'。使用'str' /'unicode'类型的split方法。 – 2010-03-16 20:07:16

回答

0

,从文件加载和重写的东西更可读

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

在最后一行,您访问直方图的索引太大。你应该确保'int_number'是最多

len(Histogram) - 1

有可能是一个错误,导致这个问题。

1

我相信问题可能是一个特殊的关闭一个在该行:

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

为什么1 +?长度为N的数组中的Python索引包含0到N-1。这里的1 +使得int_number从1到1 + (lmax-lmin)/width1 + nintervals给出的公式为width,而你已经尺寸Histogramnintervals项目 - 所以它实际上是关闭的情况二,由1 +恶化,但它会在那里(只有lmax),即使没有它。使间隔变得更加宽广,所以lmax落在最后一个里面,而不是超出它,并且丢失1 +,事情可能会更好。

+0

是的,你完全正确 – flow 2010-03-17 10:39:16

1

这里我只是删除代码是一个更Python的方法。

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) 
+0

不要使用'floor(1.0 *(item-lmin)/ width)',使用'(item - lmin)// width)'。 (有趣的是,你经历了1.0乘以前乘法的浮点乘法而不是地板划分的麻烦,当它最终确实需要地板划分时);我通常更喜欢'from __future__ import division'或调用'float'以获得浮动划分,我相信这是更习惯。) – 2010-03-17 04:29:25