如何用新数组更新二维字典中的numpy数组?解决索引越界错误
解决Numpy数组索引越界与更新失败问题
问题核心原因
- 数组索引顺序颠倒:你的Numpy数组形状是
(BOARD_HEIGHT, BOARD_WIDTH),对应**[行索引, 列索引]**的访问逻辑,但代码里用了[col, row],把列、行顺序搞反了,直接导致索引越界(比如col的值可能超过BOARD_HEIGHT的范围)。 - 字典索引方式错误:
feat_landcov[str(year),(col,row)]是错误写法,字典的键只有年份字符串,不能把坐标和年份作为复合键,必须先通过年份取出数组,再对数组做索引操作。
修复方案
1. 修正索引顺序
把数组更新代码改成feat_landcov[str(year)][row, col] = values,匹配数组的行、列顺序。
2. 检查坐标合法性(可选但推荐)
如果修正顺序后仍有越界错误,要确认row和col的取值范围是否在数组的行、列范围内:
- 所有
row的值必须小于BOARD_HEIGHT - 所有
col的值必须小于BOARD_WIDTH
可以用以下代码快速排查:
print(f"最大行索引: {max(row)}, 数组行数: {BOARD_HEIGHT}") print(f"最大列索引: {max(col)}, 数组列数: {BOARD_WIDTH}")
如果发现超出范围的坐标,需要先过滤掉无效数据。
完整修复后的代码
import time import numpy as np feat_landcov = {} for ith_col, year in enumerate(range(2015, 2020)): print(f'Start {year}...', end='') st = time.time() feat_landcov[str(year)] = np.full(shape=(BOARD_HEIGHT, BOARD_WIDTH), fill_value=-1., dtype=float) values = grouped_df.values[:, ith_col] print('value', values) coordninates = grouped_df.index row, col = zip(*coordninates) # 可选:添加坐标范围校验 assert max(row) < BOARD_HEIGHT, f"行索引超出范围: {max(row)} >= {BOARD_HEIGHT}" assert max(col) < BOARD_WIDTH, f"列索引超出范围: {max(col)} >= {BOARD_WIDTH}" # 修正索引顺序后更新数组 feat_landcov[str(year)][row, col] = values print(f"完成,耗时 {time.time() - st:.2f}s")
补充说明
你的row和col是元组类型,Numpy可以直接支持这种广播索引,不需要额外转换为数组,修正顺序后就能正常完成数组值的更新。
内容的提问来源于stack exchange,提问作者y.a.g
相关产品推荐
相关产品推荐

