NumPy索引报错求助:where结果赋值提示仅整数标量数组可转标量索引
解决NumPy索引报错:only integer scalar arrays can be converted to a scalar index
咱们先把问题的根源揪出来:你在处理ar的时候,用了两次列表推导式,把原本的NumPy数组转换成了Python普通列表。而Python列表不支持用NumPy数组(也就是naList[0]这种数组型索引)来批量赋值,这就是报错的核心原因。
修正方案:保持ar为NumPy数组
把列表推导式替换成NumPy的向量化操作,既能保持ar的数组类型,代码效率也更高:
import numpy as np # 假设y已正确填充数据,maxamount是预先定义好的变量 y = np.empty([your_row_count, 24]) # 替换成实际的行数 z = np.empty([y.shape[0], 6]) # 初始化z的行数和y一致,列数设为6 # 填充z的前几列 z[:,0] = y[:,1] z[:,1] = y[:,2] z[:,3] = y[:,3] # ... 其他列的填充逻辑保持不变 # 计算PVExport,全程保持ar为NumPy数组 ar = y[:,7] - y[:,8] # 用np.clip替代列表推导式,直接对数组做上下限截断 ar = np.clip(ar, 0, maxamount) # 获取y第6列为0的索引 naList = np.where(y[:,6] == 0) # 此时ar是NumPy数组,支持数组型索引批量赋值 ar[naList[0]] = maxamount # 填充z的第4列 z[:,4] = ar
为什么这样能解决问题?
np.clip()可以直接对整个NumPy数组完成"小于0设为0,大于maxamount设为maxamount"的操作,结果依然是NumPy数组。- NumPy原生支持用整数数组(比如
naList[0])做批量索引和赋值,这正是你需要的操作逻辑。
如果你坚持要用列表推导式(不推荐)
如果因为特殊需求必须保留列表推导式,记得最后把ar转回NumPy数组:
ar = np.array(y[:,7] - y[:,8]) ar = [maxamount if i > maxamount else i for i in ar] ar = [0 if i < 0 else i for i in ar] ar = np.array(ar) # 关键一步:把列表转回NumPy数组 naList = np.where(y[:,6] == 0) ar[naList[0]] = maxamount z[:,4] = ar
补充说明
交互窗口里能正常运行,大概率是因为你当时的ar还保持着NumPy数组类型,或者索引逻辑和脚本里不一样。但脚本里的列表推导式确实会把ar转成普通列表,导致数组索引失效。
内容的提问来源于stack exchange,提问作者Bob D
相关产品推荐
相关产品推荐

