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

