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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:07:13