NumPy数组中的复制和查看

NumPy数组中的复制和查看

在使用NumPy的过程中,你可能已经看到一些函数返回副本,而一些函数返回视图。拷贝和视图的主要区别在于,拷贝是新的数组,而视图是原数组的视图。换句话说,可以说副本在物理上存储在另一个位置,而视图的内存位置与原数组相同。

没有拷贝:普通的赋值不会对数组对象进行拷贝。相反,它使用与原数组完全相同的id来访问它。此外,任何一个对象的变化都会反映在另一个对象中。

示例: (无复制赋值)

import numpy as np
  
# creating array
arr = np.array([2, 4, 6, 8, 10])
  
# assigning arr to nc
nc = arr
  
# both arr and nc have same id
print("id of arr", id(arr))
print("id of nc", id(nc))
  
# updating nc
nc[0]= 12
  
# printing the values
print("original array- ", arr)
print("assigned array- ", nc)

输出:

id of arr 26558736
id of nc 26558736
original array-  [12  4  6  8 10]
assigned array-  [12  4  6  8 10]

视图:这也被称为浅层拷贝。视图只是原始数组的一个视图,视图并不拥有数据。当我们对视图进行修改时,会影响到原始数组,当对原始数组进行修改时,也会影响到视图。

示例:

import numpy as np
  
# creating array
arr = np.array([2, 4, 6, 8, 10])
  
# creating view 
v = arr.view()
  
# both arr and v have different id
print("id of arr", id(arr))
print("id of v", id(v))
  
# changing original array
# will effect view
arr[0] = 12
  
# printing array and view
print("original array- ", arr)
print("view- ", v)
id of arr 30480448
id of v 30677968
original array-  [12  4  6  8 10]
view-  [12  4  6  8 10]

拷贝:这也被称为深度拷贝。该副本完全是一个新的数组,副本拥有数据。当我们对副本进行修改时,不会影响到原始数组,当对原始数组进行修改时,也不会影响到副本。

示例:

import numpy as np
  
# creating array
arr = np.array([2, 4, 6, 8, 10])
  
# creating copy of array
c = arr.copy()
  
# both arr and c have different id
print("id of arr", id(arr))
print("id of c", id(c))
  
# changing original array
# this will not effect copy
arr[0] = 12
  
# printing array and copy
print("original array- ", arr)
print("copy- ", c)

输出:

id of arr 35406048
id of c 32095936
original array-  [12  4  6  8 10]
copy-  [ 2  4  6  8 10]

数组拥有它的数据:
为了检查数组在视图和拷贝中是否拥有它的数据,我们可以使用这样一个事实:每个NumPy数组都有一个属性base,如果数组拥有数据,则返回None。否则,base属性指的是原始对象。
示例:

import numpy as np
  
# creating array
arr = np.array([2, 4, 6, 8, 10])
  
# creating copy of array
c = arr.copy()
  
# creating view of array
v = arr.view()
  
# printing base attribute of copy and view
print(c.base)
print(v.base)

输出:

None
[ 2  4  6  8 10]

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Numpy 数组操作