IndexError求助:numpy数组索引越界(冰球分析程序开发)
解决冰球分析程序中的IndexError问题
问题背景
我正在开发一个基础冰球分析程序,作为pandas和numpy新手,遇到了IndexError问题。已筛选出NYR队的game_id并转为numpy数组,希望去掉每个ID的前5位数字,但在循环中直接用数组元素作为索引访问时,出现了“index 2021020004 is out of bounds for axis 0 with size 82”的错误。
相关代码
筛选数据的代码:
import numpy as np nyr_sched = nhl2021_22_sched[(nhl2021_22_sched['home_team'] == 'NYR') | (nhl2021_22_sched['away_team'] == 'NYR')] # 这段循环完全多余,直接取列即可 for game in nyr_sched: nyr_GID = nyr_sched['game_id'] nyr_GID = np.array(nyr_GID) nyr_GID.tolist() # 此行未赋值,无实际作用 nyr_GID
输出:
array([2021020004, 2021020011, 2021020023, 2021020035, 2021020059,...])
错误代码:
for i in nyr_GID: nyr_GID[i] = nyr_GID[i][5:] print("Game {} ID is {}".format(i, nyr_GID[i]))
错误栈:
IndexError Traceback (most recent call last) /var/folders/v8/z9h_xhmj1t38rzq1351q_my40000gn/T/ipykernel_13046/4170336391.py in <module> 1 count = 0 2 for i in nyr_GID: ----> 3 nyr_GID[i] = nyr_GID[i][5:] 4 print("Game {} ID is {}".format(i, nyr_GID[i])) IndexError: index 2021020004 is out of bounds for axis 0 with size 82
错误原因
核心问题有两个:
- 循环变量误用:
for i in nyr_GID中的i是数组里的game_id数值(比如2021020004),而非数组的索引(0、1、2...)。用这个超大数值去访问数组索引,必然超出数组长度(82个元素,最大索引为81)。 - 数据类型不匹配:当前
nyr_GID的元素是整数类型,整数不支持切片操作,必须先转为字符串才能执行[5:]截取。
解决方案
方法1:直接用pandas处理(最推荐)
既然数据来自pandas DataFrame,无需转numpy数组,直接对列做字符串处理更高效:
# 将game_id转为字符串,截取第5位及之后的子串 nyr_sched['short_game_id'] = nyr_sched['game_id'].astype(str).str[5:] # 若需要numpy数组,再转换 nyr_GID_short = nyr_sched['short_game_id'].to_numpy()
方法2:修正numpy循环写法
如果一定要用numpy,先转字符串类型,再通过索引循环:
# 转换为字符串数组 nyr_GID_str = nyr_GID.astype(str) # 使用数组索引循环(0到81) for idx in range(len(nyr_GID_str)): short_id = nyr_GID_str[idx][5:] print(f"Game {nyr_GID_str[idx]} ID is {short_id}") # 更高效的向量化操作(替代循环) nyr_GID_short = nyr_GID_str.str[5:]
额外优化:删除冗余代码
原代码中有两段无效代码,可直接删除:
- 遍历
nyr_sched的循环完全多余,直接通过nyr_GID = nyr_sched['game_id']取列即可。 nyr_GID.tolist()未赋值给变量,执行后无实际效果,可删除。
内容的提问来源于stack exchange,提问作者bildungsroman11
相关产品推荐
相关产品推荐

