【问题标题】:IndexError: index 9 is out of bounds for axis 0 with size 8IndexError:索引 9 超出轴 0 的范围,大小为 8
【发布时间】:2021-07-17 00:31:14
【问题描述】:

如果 Numpy Array 元素超出我的限制,我想在 for 循环中删除它。如果一个元素超出限制并且 numpy delete 函数将其删除,则我的 for 循环范围的结尾 n 减少 1。但在 for 循环内它不会减少,并且出现以下错误。如何在不破坏 for 循环的情况下从 numpy 数组中删除元素?

IndexError:索引 9 超出轴 0 的范围,大小为 8

n=9
ucl=0 + (3 * 1/ np.sqrt(n))
lcl=0 - (3 * 1/ np.sqrt(n))
x=np.random.normal(0,1,size=n)
for i in range(0,n):
  if (xbar[i]>ucl) | (xbar[i]<lcl):
    xbar=np.delete(xbar, i)
    n=n-1 

【问题讨论】:

  • 您能否提供一个最小的工作示例?标识符 xbar 未定义。此外,布尔推理的推荐运算符是or。另一个建议是遵循PEP 8,例如,在赋值符号= 两边各留一个空格,每级缩进使用4 个缩进空格。
  • range(0,n) 迭代由初始 n 固定。随着delete、xbar 的大小正在发生变化。 delete 每次都会创建一个全新的数组,所以效率很低。从列表迭代中删除项目更有效,但即使在那里你也必须非常小心迭代次数和顺序。实际上,我们通常从末尾删除,以免弄乱索引。
  • np.delete 允许您指定要删除的索引列表或数组。所以你应该可以通过一个np.delete 调用来做到这一点。

标签: python arrays numpy for-loop if-statement


【解决方案1】:

您的 n=n-1 指令没有正确缩进。 您的解决方案必须是:

for i in range(0,n):
    if (xbar[i]>ucl) | (xbar[i]<lcl):
        xbar=np.delete(xbar, i)
n=n-1

【讨论】:

  • 我犯了一个愚蠢的错误。感谢您的帮助。
猜你喜欢
  • 2018-01-11
  • 1970-01-01
  • 2019-07-30
  • 2021-11-18
  • 1970-01-01
  • 2017-02-16
  • 1970-01-01
  • 2020-04-24
  • 2016-07-29
相关资源
最近更新 更多