Python类中方法返回int值作numpy数组索引报IndexError排查
问题描述
自定义Python类在__init__初始化阶段定义变量时,需要访问类内部numpy数组的指定索引位置元素,运行时触发如下IndexError:
IndexError Traceback (most recent call last) Input In [82], in <cell line: 17>() 14 def index(self, n = 0): 15 return (len(self.array) - n).astype(int) ---> 17 something = Do_something() Input In [82], in Do_something.__init__(self, a_number) 6 self.number = a_number 7 self.array = np.zeros((1,3), dtype = float) ----> 9 self.a = self.array[self.index,0] 10 self.b = self.array[self.index,1] 11 self.c = self.array[self.index,2] IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
报错明确说明:numpy数组仅接受整数、切片(:)、省略号(...)、numpy.newaxis(即None)、整数/布尔数组作为合法索引类型。
出错原始代码
import numpy as np class Do_something: def __init__(self, a_number = 0): self.number = a_number self.array = np.zeros((1,3), dtype = float) self.a = self.array[self.index,0] self.b = self.array[self.index,1] self.c = self.array[self.index,2] #return a negative index of n def index(self, n = 0): return (len(self.array) - n).astype(int) something = Do_something()
错误根源
- 核心错误:调用实例方法
self.index时遗漏括号,传入数组索引位置的是方法对象本身,而非方法执行后返回的整数值,不符合numpy索引的类型要求。 - 附带问题:原
index方法的返回值计算逻辑存在偏差,即使正确调用方法也容易出现索引越界问题。
修复方案
修复点共两处:
- 调用
self.index时补充括号,触发方法实际执行,获取整数类型的索引值 - 调整
index方法的返回值计算逻辑,避免索引越界
修复后可正常运行的代码如下:
import numpy as np class Do_something: def __init__(self, a_number = 0): self.number = a_number self.array = np.array([[1,2,3],[4,5,6], [7,8,9]]) self.a = self.array[self.index(),0] self.b = self.array[self.index(),1] self.c = self.array[self.index(),2] # 返回指定偏移的反向索引 def index(self, n = 2): return (len(self.array) - (n + 1)) something = Do_something() print("length is " + str(len(something.array))) print(something.a) print(something.b) print(something.index())
内容的提问来源于stack exchange,提问作者thatoneguy
相关产品推荐
相关产品推荐

