【发布时间】: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