Python索引超出范围错误,不确定我做错了什么

时间:2011-03-02 22:30:02

标签: python

我是python的新手,为我的物理大学课程做了一点。

目前我正在尝试编写一个程序来计算与向量函数有关的一些东西,但这并不重要,尽管我已经完成了直到最后一部分。

到目前为止,程序会在2D图形上产生一定的局部最小值,但是我需要找到整体的最小值。

for i in range(100):
    pyplot.xlim(x0, x1) # x0, y0 etc are constants defined before in global scope
    pyplot.ylim(y0, y1)
    pyplot.plot(min_points[:,0], min_points[:,1])
    x, y = random.uniform(x0, x1), random.uniform(y0, y1)
    min_points = gradient_descent((x,y)) # gradient_descent is function used

    xmin_list, ymin_list = [], [] # now to find overall minima, initialise list
                                  # of local minima, and append those that are within
                                  # the boundaries
    if x0 < min_points[-1, 0] < x1:
        if y0 < min_points[-1, 1] < y1:

            xmin_list.append(min_points[-1, 0])
            ymin_list.append(min_points[-1, 1])

    xmin, ymin = xmin_list[0], ymin_list[1] # < error comes in this line 

为了完整性,我已经在下面包含了其余的大for循环,但它并没有给我一个错误(但是)。

    for ix in range(len(xmin_list)):
        for iy in range(len(ymin_list)):
            if f((xmin_list[ix], ymin_list[iy])) < f((xmin, ymin)):
                xmin, ymin = xmin_list[ix], ymin_list[iy]

所以它显然是在整个循环的中间,但我不知道为什么我得到错误。我正在尝试访问每个列表的最后一个元素,然后将它们附加到列表中(在检查拟合条件x0,x1等之后)。

我不确定为什么它不起作用..

我也确定这是一个相当复杂的方法来寻找最低限度,但这对我来说似乎是合乎逻辑的,我很容易混淆不得不做额外的事情,比如检查它们是否在边界内等。

感谢您的帮助!是的,我也确定我的编码看起来很糟糕和混乱,但是在我开始工作之后我会整理它们(他们不是很擅长教我们的风格,只是功能......)

编辑:对不起,忘了准确地发布错误,这里是:

Traceback (most recent call last):
  File "filepath etc etc", line 67, in <module>
    xmin, ymin = xmin_list[0], ymin_list[1]
IndexError: list index out of range

1 个答案:

答案 0 :(得分:0)

xmin, ymin = xmin_list[0], ymin_list[1] # < error comes in this line 

此处的错误是[1]。如果前面的if语句条件为False,那么ymin_list仍然是您设置的空列表,索引1已经过了结束。

此外,在第二部分中,您不需要像这样使用range(len())。尝试:

xmin = xmin_list[0]
ymin = ymin_list[0]
vmin = f((xmin, ymin))
for x in xmin_list:
    for y in ymin_list:
        v = f((x, y))
        if v < vmin:
            xmin = x
            ymin = y
            vmin = v

...想一想,你在初始化xminymin吗?