Numpy object类型数组用copy()后修改新数组原数组仍被改动是什么原因?
问题原因
你使用的tri.copy()是numpy数组的浅拷贝:
- 由于
TRI_A是dtype=object的对象数组,数组内存储的是各个子numpy数组的内存引用,而非子数组本身的实际数据 - 浅拷贝仅复制外层数组的结构,不会复制嵌套的子数组内容,拷贝得到的
out和原数组tri的第3位元素指向同一个RGB数组对象 - 当你执行
out[3][索引] = 新值操作时,修改的是两个数组共享的RGB子数组,因此原数组TRI_A也会同步变化
解决方案
有两种常用的修复方案:
方案1:使用深拷贝完全复制所有嵌套结构
引入copy模块的deepcopy方法,递归复制所有层级的数组数据,完全隔离原对象和拷贝对象:
import copy def mutate_color(tri): out = copy.deepcopy(tri) out[3][np.random.randint(3)] = np.random.randint(256) return out
方案2:仅对修改的RGB子数组单独做拷贝
如果你不需要修改前三个顶点坐标,也可以只对需要修改的RGB数组单独拷贝,性能比全量深拷贝更高:
def mutate_color(tri): out = tri.copy() # 单独拷贝RGB子数组,切断和原数组的引用关联 out[3] = out[3].copy() out[3][np.random.randint(3)] = np.random.randint(256) return out
内容的提问来源于stack exchange,提问作者Solace
相关产品推荐
相关产品推荐

