1. 副本是一个数据的完整的拷贝,如果我们对副本进行修改,它不会影响到原始数据,物理内存不在同一位置。
  2. 视图是数据的一个别称或引用,通过该别称或引用亦便可访问、操作原有数据,但原有数据不会产生拷贝。如果我们对视图进行修改,它会影响到原始数据,物理内存在同一位置。
  3. 视图一般发生在:
  4. 1numpy 的切片操作返回原数据的视图。
  5. 2、调用 ndarray view() 函数产生一个视图。
  6. 副本一般发生在:
  7. Python 序列的切片操作,调用deepCopy()函数。
  8. 调用 ndarray copy() 函数产生一个副本。
  9. 简单的赋值不会创建数组对象的副本。 相反,它使用原始数组的相同id()来访问它。 id()返回 Python 对象的通用标识符,类似于 C 中的指针。
  10. 此外,一个数组的任何变化都反映在另一个数组上。 例如,一个数组的形状改变也会改变另一个数组的形状。
  1. import numpy as np
  2.  
  3. a = np.arange(6)
  4. print ('我们的数组是:')
  5. print (a)
  6. print ('调用 id() 函数:')
  7. print (id(a))
  8. print ('a 赋值给 b:')
  9. b = a
  10. print (b)
  11. print ('b 拥有相同 id():')
  12. print (id(b))
  13. print ('修改 b 的形状:')
  14. b.shape = 3,2
  15. print (b)
  16. print ('a 的形状也修改了:')
  17. print (a)
  1. ndarray.view() 方会创建一个新的数组对象,该方法创建的新数组的维数更改不会更改原始数据的维数。
  2. import numpy as np
  3.  
  4. # 最开始 a 是个 3X2 的数组
  5. a = np.arange(6).reshape(3,2)
  6. print ('数组 a:')
  7. print (a)
  8. print ('创建 a 的视图:')
  9. b = a.view()
  10. print (b)
  11. print ('两个数组的 id() 不同:')
  12. print ('a 的 id():')
  13. print (id(a))
  14. print ('b 的 id():' )
  15. print (id(b))
  16. # 修改 b 的形状,并不会修改 a
  17. b.shape = 2,3
  18. print ('b 的形状:')
  19. print (b)
  20. print ('a 的形状:')
  21. print (a)
  1. 使用切片创建视图修改数据会影响到原始数组:
  2. import numpy as np
  3.  
  4. arr = np.arange(12)
  5. print ('我们的数组:')
  6. print (arr)
  7. print ('创建切片:')
  8. a=arr[3:]
  9. b=arr[3:]
  10. a[1]=123
  11. b[2]=234
  12. print(arr)
  13. print(id(a),id(b),id(arr[3:]))
  14. 变量 a,b 都是 arr 的一部分视图,对视图的修改会直接反映到原数据中。但是我们观察 a,b id,他们是不同的,也就是说,视图虽然指向原数据,但是他们和赋值引用还是有区别的。
  1. ndarray.copy() 函数创建一个副本。 对副本数据进行修改,不会影响到原始数据,它们物理内存不在同一位置。
  2. import numpy as np
  3.  
  4. a = np.array([[10,10], [2,3], [4,5]])
  5. print ('数组 a:')
  6. print (a)
  7. print ('创建 a 的深层副本:')
  8. b = a.copy()
  9. print ('数组 b:')
  10. print (b)
  11. # b 与 a 不共享任何内容
  12. print ('我们能够写入 b 来写入 a 吗?')
  13. print (b is a)
  14. print ('修改 b 的内容:')
  15. b[0,0] = 100
  16. print ('修改后的数组 b:')
  17. print (b)
  18. print ('a 保持不变:')
  19. print (a)

吴裕雄--天生自然Numpy库学习笔记:NumPy 副本和视图的更多相关文章

  1. 吴裕雄--天生自然C++语言学习笔记:C++ 标准库

    C++ 标准库可以分为两部分: 标准函数库: 这个库是由通用的.独立的.不属于任何类的函数组成的.函数库继承自 C 语言. 面向对象类库: 这个库是类及其相关函数的集合. C++ 标准库包含了所有的 ...

  2. 吴裕雄--天生自然C++语言学习笔记:C++ STL 教程

    C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量.链表.队列.栈. C++ 标准模板库的核心包括以 ...

  3. 吴裕雄--天生自然C++语言学习笔记:C++ Web 编程

    什么是 CGI? 公共网关接口(CGI),是一套标准,定义了信息是如何在 Web 服务器和客户端脚本之间进行交换的. CGI 规范目前是由 NCSA 维护的,NCSA 定义 CGI 如下: 公共网关接 ...

  4. 吴裕雄--天生自然C++语言学习笔记:C++ 多线程

    多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序.一般情况下,两种类型的多任务处理:基于进程和基于线程. 基于进程的多任务处理是程序的并发执行. 基于线程的多任务处理 ...

  5. 吴裕雄--天生自然C++语言学习笔记:C++ 信号处理

    信号是由操作系统传给进程的中断,会提早终止一个程序.在 UNIX.LINUX.Mac OS X 或 Windows 系统上,可以通过按 Ctrl+C 产生中断. 有些信号不能被程序捕获,但是下表所列信 ...

  6. 吴裕雄--天生自然C++语言学习笔记:C++ 模板

    模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码. 模板是创建泛型类或函数的蓝图或公式.库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念. 每个容器都有一个单 ...

  7. 吴裕雄--天生自然C++语言学习笔记:C++ 命名空间

    假设这样一种情况,当一个班上有两个名叫 Zara 的学生时,为了明确区分它们,在使用名字之外,不得不使用一些额外的信息,比如他们的家庭住址,或者他们父母的名字等等. 同样的情况也出现在 C++ 应用程 ...

  8. 吴裕雄--天生自然C++语言学习笔记:C++ 文件和流

    如何从文件读取流和向文件写入流.这就需要用到 C++ 中另一个标准库 fstream,它定义了三个新的数据类型: ofstream 该数据类型表示输出文件流,用于创建文件并向文件写入信息. ifstr ...

  9. 吴裕雄--天生自然C++语言学习笔记:C++ 数据抽象

    数据抽象是指,只向外界提供关键信息,并隐藏其后台的实现细节,即只表现必要的信息而不呈现细节. 数据抽象是一种依赖于接口和实现分离的编程(设计)技术. 它们向外界提供了大量用于操作对象数据的公共方法,也 ...

  10. 吴裕雄--天生自然C++语言学习笔记:C++ 日期 & 时间

    C++ 标准库没有提供所谓的日期类型.C++ 继承了 C 语言用于日期和时间操作的结构和函数.为了使用日期和时间相关的函数和结构,需要在 C++ 程序中引用 <ctime> 头文件. 有四 ...

随机推荐

  1. nodejs后台运行的方法

    nohup node ***.js & 这种方法可以,但存在你无法查询日志等问题 在SSH里另一个有效的方法是screen命令. [转]http://www.9usb.net/201002/l ...

  2. HTML5学习(6)a元素

    a元素代表超链接 href属性 hyper reference:通常代表跳转地址 target属性:_self在本窗口中打开(默认),_blank在新窗口中打开. id属性:全局属性,表示元素在文档中 ...

  3. execute command denied to user 'maintain'@'%' for routine

    GRANT ALL PRIVILEGES ON *.* TO 'maintain'@'%' ; FLUSH PRIVILEGES;

  4. Object.fromEntries

    //数组转换成对象 const arr = [['foo', 1],['bar', 2]] const obj = Object.fromEntries(arr) console.log(obj.ba ...

  5. Shell脚本命令汇总中

    一.换行 echo -e 可以通过\n编译换行 echo -n不换行,如果加入了\n,则会打出“\n”字符 #!/bin/bash echo -e "O\nK\n!" echo & ...

  6. kafka高吞吐,低延迟的分布式消息队列

    核心概念 broker是kafka的节点,多台broker集群就是kafka topic消息分为多个topic partition分区,topic划分了多个partition分区,存在负载均衡策略 每 ...

  7. if a != None:

    >>> x = 1 >>> not x False >>> x = [1] >>> not x False >>&g ...

  8. 转 C#中哈希表(HashTable)的用法详解

    看了一遍有关哈希表的文字,作者总结的真是不错 .收藏起来 1.  哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提 ...

  9. bugku 好多压缩包

    https://www.cnblogs.com/WangAoBo/p/6951160.html

  10. Added non-passive event listener to a scroll-blocking 'touchmove' event. Consider marking event handler as 'passive' to make the page more responsive

     Vue控制台警告:  Added non-passive event listener to a scroll-blocking 'touchmove' event. Consider markin ...