numpy索引数组越界异常求助:索引409超出轴0尺寸352范围
问题分析与解决方案
你的错误根源在于混淆了numpy数组的索引顺序,以及不必要的复杂转置操作放大了理解误区,最终导致行索引越界。
为什么会出现这个错误?
首先明确numpy图像数组的索引规则:
- 对于
shape=(H, W, 3)的图像,第一个维度H是行数(y轴方向),第二个维度W是列数(x轴方向) np.where作用于二维数组(比如img2[:, :, 2])时,返回的是两个数组:(行索引数组, 列索引数组),也就是(y坐标, x坐标)
你的代码中:
coords = np.where(img2[:, :, 2] >= 250) coords = np.transpose(np.transpose(coords)+(10, 10))
这段代码等价于给行索引和列索引分别加10,但如果你的实际需求是把(x,y)坐标偏移,而非(y,x),就会把原本范围很大的列索引(img2列数853,最大索引852)当作行索引去访问img1,而img1的行数只有352,必然出现越界(比如852+10=862>351,409就是其中一个超出范围的索引值)。
修正后的代码
我们可以直接拆分索引变量,避免转置带来的混淆,同时明确索引顺序:
import numpy as np img1 = np.random.randint(0,256, (352,870, 3), dtype=np.uint8) img2 = np.random.randint(0,256, (44,853, 3), dtype=np.uint8) # 明确拆分出行(y)和列(x)索引 y_coords, x_coords = np.where(img2[:, :, 2] >= 250) # 对行和列分别偏移10 y_coords += 10 x_coords += 10 # 正确索引img1:行在前,列在后 tmp = img1[y_coords, x_coords]
关键注意点
- 永远明确numpy的索引顺序是行优先(y轴在前,x轴在后),和我们日常习惯的
(x,y)坐标顺序相反 - 避免用复杂的转置操作来修改索引,直接拆分变量更清晰,也不容易出错
- 偏移后要验证索引范围:
- 偏移后的行索引最大为
43+10=53,远小于img1的行数352 - 偏移后的列索引最大为
852+10=862,小于img1的列数870,完全在合法范围内
- 偏移后的行索引最大为
内容的提问来源于stack exchange,提问作者deekay42
相关产品推荐
相关产品推荐

