所以我正在构建一个程序来根据给定的值列表生成直方图,主要的数字处理位如下所示:
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
上,所以我无法检查它
最佳答案
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 个容器。如果您想在纯Python中执行此操作,则必须事先使用正确数量的索引初始化列表:x = [0 for i in range(num_bins)]
(或类似)。
要在代码注释中解决您的问题:
- 是的,按照您的方法,您需要首先定义
x
(如所讨论的)。 - 不,不需要声明
i
,for i in range(0, len(data)):
会处理这个问题。
编辑:
刚刚注意到您在我处理此答案时所做的编辑:
i = 0
上的SyntaxError
实际上是由之前的行引起的:x=np.zeroes(shape=(1,bins)
缺少右括号。- 您不需要
shape=(1, bins)
因为这会给您一个二维数组。如果您想以这种方式初始化x
,请使用x = np.zeros(bins)
,而不是我的 Python 方法。
关于python 3.6.3 未声明长度列表的索引错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48530092/