标签:1024 00 07 视图 006 print 拷贝 NumPy owndata
1、什么是浅拷贝?
浅拷贝会在内存中产生不同对象,但由于拷贝的是父对象,子对象并没有拷贝,所以浅拷贝会存在共享内存
的情况,实际上,NumPy的视图np_arr.view()
是一种浅拷贝。
2、什么是深拷贝?
通过深拷贝np.copy()
得到的变量互不干扰,其中一个变量改变时,不影响其他变量的值。
3、完全没有被复制
import numpy as np
a = np.random.randint(0,10,size=(2,3))
b = a
print("【a】\n",a)
print("【b】\n",b)
print("【a is b】\n",a is b,"(a和b是两个不同变量,但是对应相同的内存对象)")
b[0,0] = 1024
print("【修改b的一个元素】\n","a:",a,"\n","b:",b,"\n【结论】\n","NumPy数组中,将a赋值给b后,由于a、b指向的内存地址相同,修改b的值的时候a的值也会被修改。")
【a】
[[6 8 9]
[9 7 2]]
【b】
[[6 8 9]
[9 7 2]]
【a is b】
True (a和b是两个不同变量,但是对应相同的内存地址对象)
【修改b的一个元素】
a: [[1024 8 9]
[ 9 7 2]]
b: [[1024 8 9]
[ 9 7 2]]
【结论】
NumPy数组中,将a赋值给b后,由于a、b指向的内存地址相同,修改b的值的时候a的值也会被修改。
4、通过视图实现浅拷贝
a = np.random.randint(0,10,size=(2,3))
b = a.view() # a与b此时共享视图、叫浅拷贝
print("【a】\n",a)
print("【b】\n",b,"(使用a中的数据创建了一个新的数组对象)")
print("【a is b】\n",a is b)
print("【b.base is a】\n",b.base is a)
print("【a.flags.owndata】\n",a.flags.owndata)
print("【b.flags.owndata】\n",b.flags.owndata)
b[0,0]=1024
print("【修改b的一个元素】\n","a:",a,"\n","b:",b)
【a】
[[0 0 1]
[4 3 8]]
【b】
[[0 0 1]
[4 3 8]] (使用a中的数据创建了一个新的数组对象)
【a is b】
False
【b.base is a】
True
【a.flags.owndata】
True
【b.flags.owndata】
False
【修改b的一个元素】
a: [[1024 0 1]
[ 4 3 8]]
b: [[1024 0 1]
[ 4 3 8]]
5、深拷贝
a = np.arange(1e8) # 这里[0~1e8]
print("【a】(这是一个超长数组)\n",a)
print("【长度】\n",a.size)
print("===【深拷贝的基本应用】===")
b_simple = a.copy()
print("【b_simple】\n",b_simple)
print("===【深拷贝的特殊应用】===")
b_save_memory = a[::10000000].copy()
del a # 删除占用大量内存的a数组
print("【b_save_memory】(从a中的每1千万中取一个数)\n",b_save_memory)
【a】(这是一个超长数组)
[0.0000000e+00 1.0000000e+00 2.0000000e+00 ... 9.9999997e+07 9.9999998e+07
9.9999999e+07]
【长度】
100000000
===【深拷贝的基本应用】===
【b_simple】
[0.0000000e+00 1.0000000e+00 2.0000000e+00 ... 9.9999997e+07 9.9999998e+07
9.9999999e+07]
===【深拷贝的特殊应用】===
【b_save_memory】(从a中的每1千万中取一个数)
[ 0. 10000000. 20000000. 30000000. 40000000. 50000000. 60000000.
70000000. 80000000. 90000000.]
标签:1024,00,07,视图,006,print,拷贝,NumPy,owndata 来源: https://www.cnblogs.com/cloucodeforfun/p/16683522.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。