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
相关产品推荐
相关产品推荐

