NumPy之三:拷贝和视图
来源:互联网 发布:勒索病毒源码 编辑:程序博客网 时间:2024/06/05 09:56
- 完全不拷贝
- 视图或浅拷贝
- 深拷贝
当对数组进行运算和操作时,其数据有时会被拷贝到一个新的数组而有时又不会拷贝。这一点常常对刚使用NumPy的用户造成困惑。以下有三种情况:
1. 完全不拷贝
简单的任务是不会对数组或其数据进行拷贝的。
>>> a = np.arange(12)>>> b = a # 不会创建新的对象>>> b is a # a和b是同一个ndarray对象的两个名字True>>> b.shape = 3,4 # 也会改变a的形状>>> a.shape(3, 4)
Python传递可变对象的引用,因此函数调用不会进行拷贝。
>>> def f(x):... print(id(x))...>>> id(a) # id是对象的唯一标识148293216>>> f(a)148293216
2. 视图或浅拷贝
不同的数组对象可以共享相同的数据。view方法会创建一个共享原数组数据的新的数组对象。
如果数组A是数组B的视图(view),则称B为A的base(除非B也是视图)。视图数组中的数据实际上保存在base数组中。
>>> c = a.view()>>> c is aFalse>>> c.base is a # c is a view of the data owned by aTrue>>> a.flags.owndata # a拥有数据True>>> c.flags.owndata # c并不拥有数据False>>>>>> c.shape = 2,6 # a的形状并不随之改变>>> a.shape(3, 4)>>> c[0,4] = 1234 # a的数据也会变>>> aarray([[ 0, 1, 2, 3], [1234, 5, 6, 7], [ 8, 9, 10, 11]])
对数组切片返回的是其视图:
>>> s = a[ : , 1:3] # spaces added for clarity; could also be written "s = a[:,1:3]">>> s[:] = 10 # s[:]是s的视图。注意s=10 和 s[:]=10的不同>>> aarray([[ 0, 10, 10, 3], [1234, 10, 10, 7], [ 8, 10, 10, 11]])
3. 深拷贝
copy方法会对数组和其数据进行完全拷贝。
>>> d = a.copy() # 创建了新的数组和新的数据>>> d is aFalse>>> d.base is a # d没有和a共享任何数据False>>> d[0,0] = 9999>>> aarray([[ 0, 10, 10, 3], [1234, 10, 10, 7], [ 8, 10, 10, 11]])
0 0
- NumPy之三:拷贝和视图
- NumPy的拷贝和视图(完全不拷贝、视图或浅拷贝、深拷贝)
- NumPy 复制和视图
- 机器学习之numpy和matplotlib学习(三)
- NumPy教程之(三)
- iphone开发内存管理之三──深拷贝和浅拷贝
- iphone开发内存管理之三──深拷贝和浅拷贝
- 混迹于C++之拷贝赋值函数和拷贝构造函数(三)
- Django学习总结之三-视图和url配置
- numpy之索引和切片
- android studio之三视图
- (三)MySql基础之视图
- C++之浅拷贝和深拷贝
- Python之深拷贝和浅拷贝
- c++之浅拷贝和深拷贝
- C++之 浅拷贝和深拷贝
- c++之浅拷贝和深拷贝
- JavaScript之浅拷贝和深拷贝
- 1622-5 孔富晨 总结《2016年12月1日》 【连续第62天总结】
- 如何清空输入输出缓存区
- CSMA/CA
- angularjs和jquery前端发送以http请求formdata数据
- 反射类加载和垃圾回收
- NumPy之三:拷贝和视图
- raw socket模拟TCP三次握手
- Android应用ViewPager和TabLayout动态加载Fragment,并实现view和tab动态刷新。
- 代码习惯如何养成
- 2016年12月1日学习总结----GDB调试器的使用
- 怎么删除项目中的SVN信
- 网络编程
- 使用多线程创建下载任务
- angular2开发配置package.json