Python Numpy矩阵相加如何覆盖原矩阵而非生成新矩阵
问题根因
你当前写法无法修改原数组的核心原因是:Numpy中使用布尔掩码进行索引时,返回的是原数组的副本而非视图。你写的x_test_da[y_test_orig == 6][i] += ...实际是先对原数组取布尔索引生成临时副本,再对副本的第i个元素执行求和操作,修改只会作用在临时副本上,不会同步到原数组。
解决方案
最优方案(无循环,性能最优)
你要实现的「所有标签为6的样本统一加上标签为9的第一个样本」的逻辑,完全可以通过Numpy广播机制批量处理,不需要循环,且直接作用在原数组上,不会生成新矩阵:
# 提前缓存掩码,避免重复计算 mask_6 = y_test_orig == 6 # 取出要加的目标数组 add_arr = x_test_da[y_test_orig == 9][0] # 直接对原数组的掩码位置执行原地加操作 x_test_da[mask_6] += add_arr
兼容循环的方案(仅当必须保留循环逻辑时使用)
如果有特殊需求必须保留循环写法,提前把符合条件的索引取出,直接通过索引定位原数组元素执行修改即可:
import numpy as np mask_6 = y_test_orig == 6 # 取出所有标签为6的样本的索引 idx_6 = np.where(mask_6)[0] add_arr = x_test_da[y_test_orig == 9][0] for i in tqdm(range(len(idx_6))): # 直接用索引定位原数组位置,执行原地修改 x_test_da[idx_6[i]] += add_arr
注意事项
- Numpy的原地操作符(
+=、-=、*=等)只有直接作用在原数组本身或者原数组的视图上时,才会修改原数组内容,只要中间步骤生成了副本,修改就不会同步到原数组 - 布尔索引、花式索引返回的都是副本,只有整数切片、连续索引才会返回视图,代码编写时需要注意区分
内容的提问来源于stack exchange,提问作者Ruben Debbaudt
相关产品推荐
相关产品推荐

