【问题标题】:IndexError: index 1000 is out of bounds for axis 0 with size 1000IndexError:索引 1000 超出轴 0 的范围,大小为 1000
【发布时间】:2016-08-20 23:08:32
【问题描述】:

我对 python 很陌生,索引对我来说仍然很困难。我正在尝试使用迭代操作绘制几个值,但似乎它不起作用并给我以上错误。请帮我。谢谢。

我的代码:

import numpy as np
import matplotlib.pyplot as mp

e = np.exp
z = np.arange(1000)


for i in z:
    while True:
    H_2 = 0.58*e(-(z[i]/81)**2)
    i += 1

mp.scatter(H_2 , z, c = 'r')
mp.show()

【问题讨论】:

  • 索引从零开始。
  • 你认为while True: 是做什么的?
  • 我认为这是一个循环,所以它会再次检查它是否满足条件'如果 i 在 z 范围内'。

标签: python for-loop numpy indexing


【解决方案1】:

因此,作为索引的一般入门,您需要记住索引是从零开始的。因此,如果您有一个包含 5 个元素的数组,则索引 0 将为您提供第一个元素,以此类推,索引 4 将为您提供第 5 个和最后一个元素。话虽如此,索引 5 因此试图访问第 6 个元素,因此是无效的。

现在到 Python,您应该知道“for x in list”语句将遍历丢失的所有元素,将实际值而不是索引放入变量 x。

【讨论】:

  • 感谢@karina 提供有用的评论。
【解决方案2】:

这一行给你错误i += 1

如果您打算使用while 循环,请不要忘记添加您的break 语句,否则您将陷入无限循环。没有任何额外的细节,我不明白为什么在这种情况下有必要。

除此之外,我会将H_2 定义为一个空列表,并将计算中的任何值附加到它。根据documentationH_2 需要是一个类似数组的值。

所以它应该是这样的:

import numpy as np
import matplotlib.pyplot as mp

e = np.exp
z = np.arange(1000)
H_2 = []

for i in z:
    H_2.append(0.58*e(-(i/81)**2))

mp.scatter(H_2 , z, c = 'r')
mp.show()

希望图表按预期显示。

【讨论】:

  • z[i] 在 for 循环的主体中应该只是 i
  • 或者,H_2 = [0.58*e(-(i/81)**2) for i in z]
  • 你是对的 z[i] 只是 i 感谢您指出这一点。正如您提到的,我还认为使用列表理解会是一种更好的方法,但是 OP 对 python 来说是新的,所以我只是保持原样。 @哈姆斯
  • 我认为这里不适合使用任何循环。 H_2 = 0.58*e(-(z/81)**2) 是使用 numpy 数组的正确方法。
  • 感谢@freshhmints,非常感谢您提供的有用答案。它工作得很好。抱歉回复晚了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 2020-04-24
  • 2016-07-29
  • 2021-07-17
  • 2021-05-24
  • 2018-07-23
  • 2019-03-01
相关资源
最近更新 更多