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

Python Numpy切片赋值失效:二维数组大于阈值元素替换为行首列值失败

问题原因

你的赋值逻辑不生效,核心原因是numpy高级索引返回的是原数组的副本而非视图。
你写的arm_resets[:, [i]][over_360]是两次索引操作:第一次用[:, [i]](传入列表作为列索引)属于高级索引,会生成一个新的数组副本,后续你对这个副本赋值,自然不会修改原arm_resets数组,所以看起来赋值没有生效。

修复方法

要避免生成副本,直接在原数组上做组合索引赋值即可,将两次索引合并为一次:

# 原错误写法
# over_360 = arm_resets[:,[i]] >= periods
# arm_resets[:,[i]][over_360] = arm_resets[:,[0]][over_360]

# 修正后写法
over_360 = arm_resets[:,i] >= periods
arm_resets[over_360, i] = arm_resets[over_360, 0]

把你示例代码中注释的替换逻辑改成上面的内容,运行后就能得到你预期的arm_resets输出:

array([[ 1,  2,  3,  4,  5,  1],
       [ 2,  2,  2,  2,  2,  2],
       [ 5,  5,  5,  5,  5,  5],
       [ 6,  6,  6,  6,  6,  6]])
0/1标记数组的高效实现

你当前用循环生成标记数组的逻辑可以直接用numpy向量化操作替代,不需要遍历每一行:
如果你的需求是标记每行中第一个大于等于periods的位置,可以用如下方法:

# 找到每行第一个>=periods的列索引
first_over = np.argmax(arm_resets >= periods, axis=1)
fin = np.zeros_like(arm_resets, dtype=int)
fin[np.arange(len(fin)), first_over] = 1

如果你的需求是标记所有小于periods的位置,直接用:

fin = (arm_resets < periods).astype(int)

可以根据你的实际业务需求调整判断逻辑即可。

内容的提问来源于stack exchange,提问作者zachvac

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:18:01