You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用新数组更新二维字典中的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 01:32:23