【问题标题】:Mysterious IndexError - very basic issue (Python)神秘的 IndexError - 非常基本的问题(Python)
【发布时间】:2013-11-19 13:09:39
【问题描述】:

我的一些代码有问题,我觉得我必须在这里遗漏一些基本的东西。一个与我遇到相同错误的简单示例如下:

from numpy import array,zeros
x = array([1,2,3])
f = zeros(len(x))

for i in x:
    f[i] = x[i] + 1

回溯如下:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
C:\WINDOWS\system32\<ipython-input-5-6b6b88f30156> in <module>()
      1 for i in x:
----> 2     f[i] = x[i] + 1
      3 

IndexError: index out of bounds

这让我困惑太久了,但我似乎看不出这里有什么问题?有人可以帮忙吗?

【问题讨论】:

  • 令我印象深刻的是,您在 array[(1, 2, 3)] 上没有收到错误,或者没有导入 zeros... - 您是在复制/粘贴代码,还是在输入代码?跨度>
  • 正在输入,在控制台中已正确完成,对此感到抱歉!

标签: python python-2.7 for-loop numpy


【解决方案1】:

在这个循环中:

for i in x:
    f[i] = x[i] + 1

i 取值 1、2 和 3。x[i] 不是你想的那样。 i 已经包含数组 x 的单元格的内容。由于数组的索引从 0 开始,因此在尝试获取索引为 3 的元素(将是第 4 个元素)时执行IndexError

你可能想要这样的东西:

for i in range(len(x)):
    f[i] = x[i] + 1

也可以这样写:

for i, v in enumerate(x):
    f[i] = v + 1

【讨论】:

    【解决方案2】:

    当您执行for i in some_list 时,i 指的是该列表的元素,而不是它们的索引。例如:

    In [1]: for i in [3, 2, 1]:
       ...:     print i
       ...:     
    3
    2
    1
    

    但是,您随后使用 i 作为索引。

    您在x 上使用i 进行迭代,因此i 采用123 的值。但是3 对于长度为 3 的数组来说是一个太大的索引。最后一个索引是2,因为在 Python 中索引从 0 开始。

    【讨论】:

    • 我想我明白了,所以即使 Python 索引以 0 开头,for 循环也从 i=1 开始?在这种情况下,向f 添加一个额外的元素应该可以解决我的问题,但这似乎不是一个特别优雅的解决方案?
    • @user3008862 它以i=1 开头,因为1 是数组的第0 个元素。我稍微扩展了答案以使其更清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 2011-01-30
    相关资源
    最近更新 更多