奇怪的python错误
我正试图编写一个python程序来计算直方图,给出一个数字列表,如:奇怪的python错误,python,Python,我正试图编写一个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
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
四,
但不知何故,我完全迷路了,我犯了奇怪的错误,有人能帮我吗
谢谢
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
最重要的错误是:
项目最小/宽度=1.0/0.6667=1.5
及
索引器错误:索引超出范围在最后一行,您访问的直方图索引太大。您应该确保“int_number”最多为 len(Histogram) - 1
可能是一个bug导致了这个问题。我相信这个问题可能是由一个特殊的错误引起的:
int_number = 1 + int((item-lmin)/width)
为什么是1+?长度为N的数组上的Python索引包括0到N-1。这里的1+使int_数从1变为1+lmax lmin/width,即根据宽度公式变为1+nintervals,而你已经将直方图调整为nintervals项的大小-因此它实际上是一个差2,比1+更糟,但即使没有它,它也只适用于lmax。使间隔变宽一个ε,这样lmax会落在最后一个ε的内部,而不是超出它,并失去1+,事情可能会更好。我刚刚删除了从文件加载的代码,并重写为更可读的代码
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))
这里有一个更为通灵的方法
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:f.readline时使用。用于f中的行:。不要使用string.split。使用str/unicode类型的split方法。不要用大写字母命名变量。当人们不是类时,他们会感到困惑。不要使用insert将某些内容放在列表的末尾。使用append方法。不要使用floor1.0*项lmin/width。使用item-lmin//width。有趣的是,你经历了通过1.0的预乘来获得浮点除法而不是地板除法的麻烦,结果你真的想要地板除法;我通常更喜欢从uuu future uuuu导入除法或调用float来获得float除法,我认为这更为惯用。