如何多次克隆NumPy数组?解决阈值处理副本影响原数组的问题
解决NumPy数组赋值后修改联动的问题
嘿,这个坑我之前踩过!你遇到的问题本质是NumPy数组的引用赋值导致的——当你写pic1 = pic和pic2 = pic时,并没有创建新的数组,只是给同一个内存里的数组多起了两个别名。所以不管你修改pic1、pic2还是原数组pic,其实都是在操作同一块内存数据,自然会互相影响。
要解决这个问题,你需要对原数组做深拷贝,让pic1和pic2成为完全独立的新数组。这里有两种简单可靠的方法:
方法1:使用数组自带的copy()方法
这是最直观的写法,直接调用NumPy数组的内置拷贝方法:
import numpy as np import cv2 # 注意:这里Videocapture要改成VideoCapture(首字母大写),否则会报错 cap = cv2.VideoCapture(0) _, pic = cap.read() # 执行深拷贝,生成独立的新数组 pic1 = pic.copy() pic2 = pic.copy() # 现在修改pic1和pic2就不会影响原数组pic了 pic1[pic1 > 100] = 255 pic2[pic2 > 200] = 255
方法2:使用np.copy()函数
和上面的效果完全一致,只是写法换成了调用NumPy的全局拷贝函数:
pic1 = np.copy(pic) pic2 = np.copy(pic)
补充说明:为什么直接赋值不行?
在Python中,像NumPy数组、列表这种可变对象,直接赋值a = b并不会复制对象的内容,只是把变量a指向了b所在的内存地址。只有通过显式的拷贝操作,才会在内存中开辟新的空间,存储和原数组完全相同的内容,这样两个数组就彻底独立了。
另外还要提醒你:代码里的cv2.Videocapture(0)拼写错误了,正确的是cv2.VideoCapture(0)(首字母V和C要大写),不然运行时会抛出属性错误哦。
内容的提问来源于stack exchange,提问作者Hojo.Timberwolf
相关产品推荐
相关产品推荐

