Python索引超出范围错误,不知道哪里出错了

0 投票
1 回答
1455 浏览
提问于 2025-04-16 12:52

我对Python还比较陌生,之前在大学物理课上用过一点。

现在我正在尝试写一个程序,用来计算一些与向量函数有关的东西,不过这部分不太重要,因为我已经把前面的部分都搞定了,只有最后一部分还没解决。

到目前为止,这个程序在一个二维图上产生了一些局部最小值,但我需要找到整体的最小值。

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 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
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 呢?

撰写回答