所以我正在构建一个程序来从给定的值列表生成直方图,主数字运算位如下所示:
x=[] #declare x list(unnecessary?)
i=0 #declare i (unnecessary?)
for i in range(0, len(data)):
comp = data[i] #grab 'i'th data value
for j in range(0, bins): #determine which bin data point belongs
lorng=lo+(j*binwidth)
hirng=lo+((j+1)*binwidth)
if comp==lo:
x[0]+=1 #increment lowest value bin for lowest value data
if comp > lorng and comp <= hirng:
x[j]+=1 #increment bin for data in a given range
print(x)
不幸的是我在x[0]+=1
上获得了超出范围错误的列表索引。我需要声明列表长度吗?从其他线索来看,我似乎不需要这样做。
修改:我已将x[]
更改为x=np.zeroes(shape=(1,bins)
,但现在它在i=0
上抛出了无效的语法错误,因此无法检查
答案 0 :(得分:2)
x
是一个空列表,不支持任何类型的索引。这就是x[0]+=1
给出错误的原因。
由于您可以使用numpy
,因此可以使用histogram
获得相同的效果。
import numpy as np
values = np.random.randint(0, 101, 1000)
hist = np.histogram(values, bins=10)
print(hist)
这将创建一个包含0到100之间的1000个随机数的列表,然后将它们分成10个bin。如果你想在纯python中这样做,你必须事先用正确的索引数量初始化你的列表:x = [0 for i in range(num_bins)]
(或类似的)。
在代码评论中解决您的问题:
x
(如上所述)。i
,for i in range(0, len(data)):
会照顾到这一点。 编辑:
刚刚注意到我在编写这个答案时所做的编辑:
SyntaxError
上的i = 0
实际上是由以前的行引起的:x=np.zeroes(shape=(1,bins)
错过了关闭的parens。 shape=(1, bins)
因为那会给您一个2D数组。如果您想以这种方式初始化x
,请使用x = np.zeros(bins)
而不是我的python方法。答案 1 :(得分:0)
您的列表一开始没有任何内容。因此,您需要对其进行zerofill以按索引访问所有元素,而无需显式插入它们。
x=[0] * bins
for i in range(0, len(data)):
comp = data[i]
for j in range(0, bins):
lorng=lo+(j*binwidth)
hirng=lo+((j+1)*binwidth)
if comp==lo:
x[0]+=1 #increment lowest value bin for lowest value data
if comp > lorng and comp <= hirng:
x[j]+=1 #increment bin for data in a given range
print(x)
值得注意的是x = [0] * bins
使用x
零初始化列表bins
。