NumPy 拷贝与视图

PythonPythonBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在本教程中,你将学习 NumPy 库中 ndarray 的拷贝(copy)和视图(view)概念。你将学习如何使用 copy()view() 函数来创建现有数组的新拷贝或为数组创建新视图。你还将了解拷贝和视图之间的区别以及它们的不同行为。

虚拟机提示

虚拟机启动完成后,点击左上角切换到 Notebook 选项卡以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟,直到 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,请随时向 Labby 提问。在课程结束后提供反馈,我们将及时为你解决问题。

理解拷贝(Copy)与视图(View)的区别

拷贝(copy)和视图(view)的主要区别在于,copy() 函数会创建一个新数组,而 view() 函数会为原始数组创建一个新视图。当我们创建输入数组的新拷贝时,它会被存储在不同的内存位置;而当我们创建视图时,它会指向与原始数组相同的内存位置。这意味着对输入数组的拷贝所做的任何更改都不会影响原始数组,反之亦然。然而,对视图所做的任何更改都会影响原始数组,反之亦然。

无拷贝或数组赋值

如果你将一个 NumPy 数组赋值给另一个数组,它并不会创建原始数组的直接拷贝。相反,它会创建另一个具有相同内容和 ID 的数组,该数组成为原始数组的引用。如果你对这个引用数组进行任何更改,这些更改会直接反映在原始数组中。

import numpy as np

input_arr = np.array([[5,2,7,4],[9,0,2,3],[1,2,3,19]])
print("The Original Array is :\n")
print(input_arr)
print("\nThe ID of array a:")
print(id(input_arr))

b = input_arr #assigning input_arr to b
print("\nNow we make the copy of the input_arr")
print("\nThe ID of b:")
print(id(b))
b.shape = 4, 3 #making some changes to b
print("\nThe Changes on b also reflect to a:")
print(input_arr)

NumPy 拷贝或深拷贝(Deep Copy)

当我们使用 copy() 函数创建拷贝时,它也被称为深拷贝(deep copy)。数组的拷贝拥有自己的数据,这意味着对拷贝所做的任何更改都不会影响原始数组,反之亦然。

要创建输入数组的深拷贝,我们可以使用 numpy.ndarray.copy() 函数。

import numpy as np

## 创建一个数组
a = np.array([5, 4, 6, 8, 9])

## 创建输入数组的拷贝
c = a.copy()

## 检查 a 和 c 的 ID
print("The id of input array a:")
print(id(a))
print("The id of c is:")
print(id(c))

## 修改原始数组
a[0] = 25

## 打印原始数组和拷贝
print("The original array:")
print(a)
print("The copy is:")
print(c)

NumPy 视图或浅拷贝(Shallow Copy)

当我们创建数组的视图时,它也被称为浅拷贝(shallow copy)。视图仅指向原始数组,并不拥有数据。这意味着对视图所做的任何更改都会影响原始数组,反之亦然。

要创建输入数组的视图,我们可以使用 numpy.ndarray.view() 函数。

import numpy as np

## 给定的输入数组
ar = np.array([2, 4, 6, 8, 10, 12])

## 创建视图
v = ar.view()

## 现在 ar 和 v 将有不同的 ID
print("The id of ar")
print(id(ar))
print("The id of v")
print(id(v))

## 更改原始数组也会影响视图
ar[3] = 16

## 打印原始数组和视图
print("The original array:")
print(ar)
print("The view:")
print(v)

总结

在本教程中,你学习了 NumPy 库中 ndarray 的拷贝(copy)和视图(view)的概念。你学会了如何使用 copy()view() 函数来创建现有数组的新拷贝或为数组创建新视图。你还了解了拷贝和视图之间的区别以及它们的不同行为。我们建议通过更多示例来练习这些概念。