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

结构化NumPy数组原地修改无效果?求纯NumPy解决方案

如何原地修改NumPy结构化数组的值?

当然可以修改NumPy结构化数组的值,你碰到的问题出在链式索引返回的是副本而非视图:arr[arr['A'] == 1]这种布尔索引操作会生成原数组的临时副本,后续对['B']的赋值只改动了这个副本,原数组根本没受到影响。

纯NumPy环境下的解决方法

方法1:调换索引顺序,先取字段再用布尔索引

先定位到要修改的字段'B'(这会返回原数组的视图),再用布尔索引筛选目标元素,直接赋值即可:

arr['B'][arr['A'] == 1] = 555

方法2:用np.where获取索引位置后赋值

先通过np.where找到符合条件的元素下标,再直接通过下标修改:

idx = np.where(arr['A'] == 1)[0]
arr['B'][idx] = 555

修改后的完整示例代码

import numpy as np

dt = {'names':['A', 'B', 'C'],
        'formats': [np.int64, np.int64, np.dtype('U8')]}
arr = np.empty(0, dtype=dt)

arr = np.append(arr, np.array([(1, 100, 'ab')], dtype = dt))
arr = np.append(arr, np.array([(2, 800, 'ax')], dtype = dt))
arr = np.append(arr, np.array([(3, 700, 'asb')], dtype = dt))
arr = np.append(arr, np.array([(4, 600, 'gdf')], dtype = dt))
arr = np.append(arr, np.array([(5, 500, 'hfg')], dtype = dt))

print("修改前:")
print(arr)

# 使用方法1修改
arr['B'][arr['A'] == 1] = 555

print("\n修改后:")
print(arr)

运行这段代码后,你会看到原数组中A=1对应的B值已经成功改成555了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:45:31