如何正确设置NumPy三维数组的索引?运行赋值代码报错如何解决
三维数组索引报错解决方案
问题核心原因
你代码报错的根本原因是三维数组的维度定义顺序和索引顺序不匹配:
- 调用
np.zeros((p,n,m))生成数组时,三个维度的顺序为「第0维长度p=4,第1维长度n=5,第2维长度m=5」,合法索引范围是:- 第0维:0~3
- 第1维:0~4
- 第2维:0~4
- 你赋值时使用的
arr[i][j][k]中,i遍历的是range(m),取值范围为0~4,超过了第0维的最大合法索引3,直接触发索引越界报错。
修正方案
方案1:调整赋值索引顺序(匹配现有数组定义)
把赋值语句的索引顺序和数组定义的维度顺序对应即可,修改后的完整代码如下:
import numpy as np import random m,n,p=5,5,4 arr=np.zeros((p,n,m)) def insertingArray(arr): for k in range(p): for i in range(m): for j in range(n): # 调整索引顺序为k(对应p维度)、j(对应n维度)、i(对应m维度) arr[k][j][i] = random.randint(1,10) insertingArray(arr) print(arr)
方案2:调整数组初始化维度顺序(匹配现有索引逻辑)
如果你的业务逻辑本身就需要arr[i][j][k]的索引顺序对应m、n、p三个维度,直接修改数组初始化的参数即可,其余代码无需改动:
# 把维度顺序改为(m,n,p),和索引顺序匹配 arr=np.zeros((m,n,p))
效率优化建议
不需要用Python三重循环给numpy数组赋值,可以直接调用numpy的随机数生成接口,一行代码完成相同效果,运行效率高很多:
arr = np.random.randint(1, 11, size=(p,n,m))
内容的提问来源于stack exchange,提问作者Hamza Ali
相关产品推荐
相关产品推荐

