【问题标题】:Index out of bounds error that I cannot resolve我无法解决的索引越界错误
【发布时间】:2021-11-03 13:30:34
【问题描述】:

我有一个非常简单的 python 问题,但是我摆弄了一些数字,它仍然不起作用。

import random
import numpy as np

class Room:
 def __init__(self, name, contents):
  self.name = name
  self.contents = contents

rooms = np.zeros((10, 10))

emptyRooms = []

halfHeight = int(len(rooms[1]) / 2)
halfWidth = int(len(rooms[0]) / 2)

rooms[halfWidth][halfHeight] = 1

for r in range(len(rooms)):
 for c in range(len(rooms)):
  if rooms[r][c] == 1:
   if rooms[r][c-1] != 1:
    rooms[r][c-1] = 1
   if rooms[r][c+1] != 1:
    rooms[r][c+1] = 1
   if rooms[r-1][c] != 1:
    rooms[r-1][c] = 1
   if rooms[r+1][c] != 1:
    rooms[r+1][c] = 1

 print(rooms)

这是输出:

Traceback (most recent call last):
 File "main.py", line 27, in <module>
  if rooms[r+1][c] != 1:
 IndexError: index 10 is out of bounds for axis 0 with size 10

就像我说的,我已经尝试过修改数字,但仍然出现错误。我不知道如何解决它。

【问题讨论】:

  • Python 索引从 0 开始。你的大小是 10。当你的 r 等于 9(最后一个索引)时,r+1 是 10,所以 rooms[r+1] 会导致异常。在大多数其他语言中,您之前会遇到相同的错误 - 使用 c-1 (c==0, c-1==-1 - 但 python 接受负索引 -i 作为 len-i)。

标签: python python-3.x numpy


【解决方案1】:

如果您想在遍历数组时使用索引访问数组中的下一个元素,则需要遍历到倒数第二个元素。在这里,您使用 rooms[r][c+1]rooms[r+1][c] 将 r 和 c 作为索引。在最后一次迭代中,您的索引超出范围。因此,在这里您需要将循环迭代到倒数第二个索引。试试下面的代码:

import random
import numpy as np

class Room:
    def __init__(self, name, contents):
        self.name = name
        self.contents = contents

rooms = np.zeros((10, 10))

emptyRooms = []

halfHeight = int(len(rooms[1]) / 2)
halfWidth = int(len(rooms[0]) / 2)

rooms[halfWidth][halfHeight] = 1

for r in range(len(rooms) - 1):
    for c in range(len(rooms) - 1):
        if rooms[r][c] == 1:
            if rooms[r][c-1] != 1:
                rooms[r][c-1] = 1
            if rooms[r][c+1] != 1:
                rooms[r][c+1] = 1
            if rooms[r-1][c] != 1:
                rooms[r-1][c] = 1
            if rooms[r+1][c] != 1:
                rooms[r+1][c] = 1

print(rooms)

这里我将循环初始化为range(len(rooms) - 1),而不是range(len(rooms))。我希望它能解决这个问题。

【讨论】:

  • 这不会跳过r轴和z轴的最后一个房间吗?
  • 是的,它不会处理最后一个房间,但假设程序的输出,它将所有大于房间[halfHeight][halfWidth]的值设置为1。当前输出的作用相同,将 rooms[len(rooms) - 1][len(rooms) - 1] 保留为 0。
  • 根据程序的目标,我们可以调整代码,但这是解决错误并理解错误的方法。
  • 这应该可以,但是如果您真的想检查列表的最后一行和最后一列,请查看我的答案。但@Nouman Ahsan 是对的,因为这里没有指定任何不同之处。
  • 这很有效,它仍然会改变底部和右侧的值!谢谢!
【解决方案2】:

您必须检查 r+1 或 c+1 是否小于 10,因为它会尝试索引一个不存在的元素 (通常也称为越界).

所以在你的代码中:

import random
import numpy as np

class Room:
 def __init__(self, name, contents):
  self.name = name
  self.contents = contents

rooms = np.zeros((10, 10))

emptyRooms = []

halfHeight = int(len(rooms[1]) / 2)
halfWidth = int(len(rooms[0]) / 2)

rooms[halfWidth][halfHeight] = 1

for r in range(len(rooms)):
 for c in range(len(rooms)):
  if rooms[r][c] == 1:
   if (c-1) >= 0 and rooms[r][c-1] != 1:
    rooms[r][c-1] = 1
   if (c+1) < 10 and rooms[r][c+1] != 1:
    rooms[r][c+1] = 1
   if (r-1) >= 0 and rooms[r-1][c] != 1:
    rooms[r-1][c] = 1
   if (r+1) < 10 and rooms[r+1][c] != 1:
    rooms[r+1][c] = 1
print(rooms)

要确保在 c 或 r 加 1 的每个位置,得到的整数永远不会大于或等于 10(总是会导致超出范围错误)。

编辑:可能您也不希望在负方向上获得包装结果。所以我还添加了对负方向的检查。 (带有 '(r-1) >= 0' 的部分。)

【讨论】:

    【解决方案3】:

    你有c+1,当c是最后一个range(len(rooms)):crange(len(rooms)):c+1将超出范围。

    【讨论】:

      猜你喜欢
      • 2017-04-29
      • 2014-06-06
      • 2015-03-22
      • 2013-10-13
      • 2015-01-10
      • 2014-01-27
      • 2017-03-23
      相关资源
      最近更新 更多