- NumPy 教程
- NumPy - 主页
- NumPy - 简介
- NumPy - 环境
- NumPy - Ndarray 对象
- NumPy - 数据类型
- NumPy - 数组属性
- NumPy - 数组创建例程
- NumPy - 来自现有数据的数组
- 来自数值范围的数组
- NumPy - 索引和切片
- NumPy - 高级索引
- NumPy - 广播
- NumPy - 迭代数组
- NumPy - 数组操作
- NumPy - 二元运算符
- NumPy - 字符串函数
- NumPy - 数学函数
- NumPy - 算术运算
- NumPy - 统计函数
- 排序、搜索和计数功能
- NumPy - 字节交换
- NumPy - 副本和视图
- NumPy - 矩阵库
- NumPy - 线性代数
- NumPy-Matplotlib
- NumPy - 使用 Matplotlib 绘制直方图
- NumPy - 使用 NumPy 进行 I/O
- NumPy 有用资源
- NumPy - 快速指南
- NumPy - 有用的资源
- NumPy - 讨论
NumPy - 副本和视图
在执行函数时,其中一些返回输入数组的副本,而另一些则返回视图。当内容物理存储在另一个位置时,称为复制。另一方面,如果提供相同内存内容的不同视图,我们将其称为View。
无副本
简单赋值不会复制数组对象。相反,它使用原始数组的相同 id() 来访问它。id ()返回Python对象的通用标识符,类似于C中的指针。
此外,其中任何一个的变化都会反映在另一个中。例如,一个形状的改变也会改变另一个形状。
例子
import numpy as np a = np.arange(6) print 'Our array is:' print a print 'Applying id() function:' print id(a) print 'a is assigned to b:' b = a print b print 'b has same id():' print id(b) print 'Change shape of b:' b.shape = 3,2 print b print 'Shape of a also gets changed:' print a
它将产生以下输出 -
Our array is: [0 1 2 3 4 5] Applying id() function: 139747815479536 a is assigned to b: [0 1 2 3 4 5] b has same id(): 139747815479536 Change shape of b: [[0 1] [2 3] [4 5]] Shape of a also gets changed: [[0 1] [2 3] [4 5]]
查看或浅复制
NumPy 有ndarray.view()方法,它是一个新的数组对象,它查看原始数组的相同数据。与之前的情况不同,新数组尺寸的更改不会更改原始数组的尺寸。
例子
import numpy as np # To begin with, a is 3X2 array a = np.arange(6).reshape(3,2) print 'Array a:' print a print 'Create view of a:' b = a.view() print b print 'id() for both the arrays are different:' print 'id() of a:' print id(a) print 'id() of b:' print id(b) # Change the shape of b. It does not change the shape of a b.shape = 2,3 print 'Shape of b:' print b print 'Shape of a:' print a
它将产生以下输出 -
Array a: [[0 1] [2 3] [4 5]] Create view of a: [[0 1] [2 3] [4 5]] id() for both the arrays are different: id() of a: 140424307227264 id() of b: 140424151696288 Shape of b: [[0 1 2] [3 4 5]] Shape of a: [[0 1] [2 3] [4 5]]
数组的切片创建一个视图。
例子
import numpy as np a = np.array([[10,10], [2,3], [4,5]]) print 'Our array is:' print a print 'Create a slice:' s = a[:, :2] print s
它将产生以下输出 -
Our array is: [[10 10] [ 2 3] [ 4 5]] Create a slice: [[10 10] [ 2 3] [ 4 5]]
深拷贝
ndarray.copy ()函数创建一个深层副本。它是数组及其数据的完整副本,并且不与原始数组共享。
例子
import numpy as np a = np.array([[10,10], [2,3], [4,5]]) print 'Array a is:' print a print 'Create a deep copy of a:' b = a.copy() print 'Array b is:' print b #b does not share any memory of a print 'Can we write b is a' print b is a print 'Change the contents of b:' b[0,0] = 100 print 'Modified array b:' print b print 'a remains unchanged:' print a
它将产生以下输出 -
Array a is: [[10 10] [ 2 3] [ 4 5]] Create a deep copy of a: Array b is: [[10 10] [ 2 3] [ 4 5]] Can we write b is a False Change the contents of b: Modified array b: [[100 10] [ 2 3] [ 4 5]] a remains unchanged: [[10 10] [ 2 3] [ 4 5]]