【问题标题】:Python - Slicing error: IndexError: index 3 is out of bounds for axis 2 with size 3Python - 切片错误:IndexError:索引 3 超出轴 2 大小为 3 的范围
【发布时间】:2020-12-26 09:56:54
【问题描述】:

我正在尝试使用代码对 3D 数组进行切片,以便一次只查找 [0:,i,j]。例如,我有 arr 打印:

[[[ 0  1  2]
  [ 3  4  5]
  [ 6  7  8]]

 [[ 9 10 11]
  [12 13 14]
  [15 16 17]]]

如果我想要 [0:,0,0] 它会正确打印 [0,9]。如果我想要 [0:,0,1] = [1,10], [0:,0,2] = [2,11], [0:,1,0] = [3,12] 等等。所有手动完成时正确。但我希望这是自动化的,当我尝试以下代码时:

import numpy as np

arr = np.arange(18).reshape(2,3,3)

for k in arr:
    for i in k:
        for j in i:
            print(arr[0:,i,j])

它给出了错误:IndexError: index 3 is out of bounds for axis 2 with size 3 帮忙?

【问题讨论】:

  • 这不是 Numpy 的事情;这是 Python 基础知识。它也与切片或索引无关。您的误解与 for 循环的工作原理有关
  • 为了放大@KarlKnechtel 的评论,循环将元素,而不是变量中的索引。尝试打印ij 而不是切片,它会很清晰。
  • 你到底想做什么?你很少需要遍历一个 numpy 数组
  • 谢谢你,@MarkMeyer!现在我明白我做错了什么!

标签: python slice


【解决方案1】:

当您使用for j in i: 时,您实际上是在迭代数组的元素,而不是索引。所以j 将获得从 0 到 17 的值。类似地,i 将获得一维数组的值,每行一个。

如果我想要 [0:,0,0] 它会正确打印 [0,9]。如果我想要 [0:,0,1] = [1,10], [0:,0,2] = [2,11], [0:,1,0] = [3,12] 等

所以您只需要两级迭代并使用range(3) 来检查有效索引:

for i in range(3):
    for j in range(3):
        print(art[0:,i,j])

请注意,您不需要 for k 部分,因为您只迭代数组的三个维度中的两个。

【讨论】:

  • print(arr[0:,i,j]) 适用于 OP,并且是一个完全正常的构造......当使用 NumPy 时。只要ij 具有正确的值,至少。
  • @KarlKnechtel 是的,但是在包含for k in ... 的块中使用它很奇怪,其中k 没有被引用。换句话说,很容易判断代码为什么会被破坏。但是很难说出正确的解决方法是什么,因为我无法确定代码应该实际做什么......同意吗?
  • @KarlKnechtel 我现在刚刚重新阅读了这个问题,我看到 OP 确实提到了它。更新了答案。
  • @filbranden 谢谢!当我决定先重新加载页面时,我正在回复。现在我明白了我对 for 循环如何处理数组的误解。
猜你喜欢
  • 2019-08-26
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 2017-05-30
  • 2021-05-16
  • 1970-01-01
  • 2020-08-12
  • 2019-03-01
相关资源
最近更新 更多