python numpy数组中的复制知识解析

1. 简介

在Python的科学计算库NumPy中,数组是最基本的数据结构之一。与Python中的列表不同,NumPy数组在处理大量数据时具有更高的效率和便捷性。本文将详细介绍NumPy数组的复制操作。

2. 数组的复制操作

2.1 浅复制

NumPy数组的浅复制是指创建一个新数组,该数组与原始数组的数据相同,并且数据的ID(内存地址)相同。这意味着对新数组所做的更改会反映在原始数组中。可以使用切片语法或者view()方法进行浅复制。

下面是通过切片语法复制NumPy数组的示例:

import numpy as np

# 创建原始数组

arr1 = np.array([1, 2, 3, 4, 5])

# 创建新数组

arr2 = arr1[:]

# 输出数组

print("原始数组:", arr1)

print("复制数组:", arr2)

# 修改复制数组中的一个元素

arr2[3] = 0

# 输出修改后的数组

print("修改后的原始数组:", arr1)

print("修改后的复制数组:", arr2)

运行结果:

原始数组: [1 2 3 4 5]

复制数组: [1 2 3 4 5]

修改后的原始数组: [1 2 3 0 5]

修改后的复制数组: [1 2 3 0 5]

从运行结果可以看出,修改复制数组中的元素导致原始数组中的元素也被修改。

下面是使用view()方法复制NumPy数组的示例:

import numpy as np

# 创建原始数组

arr1 = np.array([1, 2, 3, 4, 5])

# 创建新数组

arr2 = arr1.view()

# 输出数组

print("原始数组:", arr1)

print("复制数组:", arr2)

# 修改复制数组中的一个元素

arr2[3] = 0

# 输出修改后的数组

print("修改后的原始数组:", arr1)

print("修改后的复制数组:", arr2)

运行结果:

原始数组: [1 2 3 4 5]

复制数组: [1 2 3 4 5]

修改后的原始数组: [1 2 3 0 5]

修改后的复制数组: [1 2 3 0 5]

从运行结果可以看出,使用view()方法复制数组的效果与使用切片语法复制数组的效果一样。

2.2 深复制

NumPy数组的深复制是指创建一个新数组,该数组与原始数组的数据相同,但数据的ID(内存地址)不同。这意味着对新数组所做的更改不会反映在原始数组中。可以使用copy()方法进行深复制。

下面是使用copy()方法复制NumPy数组的示例:

import numpy as np

# 创建原始数组

arr1 = np.array([1, 2, 3, 4, 5])

# 创建新数组

arr2 = arr1.copy()

# 输出数组

print("原始数组:", arr1)

print("复制数组:", arr2)

# 修改复制数组中的一个元素

arr2[3] = 0

# 输出修改后的数组

print("修改后的原始数组:", arr1)

print("修改后的复制数组:", arr2)

运行结果:

原始数组: [1 2 3 4 5]

复制数组: [1 2 3 4 5]

修改后的原始数组: [1 2 3 4 5]

修改后的复制数组: [1 2 3 0 5]

从运行结果可以看出,修改复制数组中的元素不会导致原始数组中的元素被修改。

2.3 数组的视图操作

除了切片和view()方法之外,NumPy还提供了一些高级的视图操作,可以在不复制数据的情况下创建数组的视图。其中最常见的视图操作是transpose()和reshape(),它们可以分别用于交换数组的维度和改变数组的形状。

下面是使用transpose()方法创建数组的视图的示例:

import numpy as np

# 创建原始数组

arr1 = np.array([[1, 2], [3, 4]])

# 创建数组的视图

arr2 = arr1.transpose()

# 输出数组

print("原始数组:")

print(arr1)

print("视图数组:")

print(arr2)

# 修改视图数组中的一个元素

arr2[1][0] = 0

# 输出修改后的数组

print("修改后的原始数组:")

print(arr1)

print("修改后的视图数组:")

print(arr2)

运行结果:

原始数组:

[[1 2]

[3 4]]

视图数组:

[[1 3]

[2 4]]

修改后的原始数组:

[[1 0]

[3 4]]

修改后的视图数组:

[[1 3]

[0 4]]

从运行结果可以看出,修改视图数组中的元素会导致原始数组中的元素也被修改。

下面是使用reshape()方法创建数组的视图的示例:

import numpy as np

# 创建原始数组

arr1 = np.arange(12)

# 创建数组的视图

arr2 = arr1.reshape(3, 4)

# 输出数组

print("原始数组:")

print(arr1)

print("视图数组:")

print(arr2)

# 修改视图数组中的一个元素

arr2[1][2] = 0

# 输出修改后的数组

print("修改后的原始数组:")

print(arr1)

print("修改后的视图数组:")

print(arr2)

运行结果:

原始数组:

[ 0 1 2 3 4 5 6 7 8 9 10 11]

视图数组:

[[ 0 1 2 3]

[ 4 5 6 7]

[ 8 9 10 11]]

修改后的原始数组:

[ 0 1 2 3 4 5 0 7 8 9 10 11]

修改后的视图数组:

[[ 0 1 2 3]

[ 4 5 0 7]

[ 8 9 10 11]]

从运行结果可以看出,修改视图数组中的元素会导致原始数组中的元素也被修改。

3. 总结

本文详细介绍了NumPy数组的复制操作。浅复制是将原始数组的数据复制到新数组中,并与原始数组具有相同的ID,因此修改新数组中的元素会反映在原始数组中;深复制是将原始数组的数据复制到新数组中,并与原始数组具有不同的ID,因此修改新数组中的元素不会反映在原始数组中。此外,NumPy还提供了一些高级的视图操作,可以在不复制数据的情况下创建数组的视图。

为了更好地理解NumPy数组的复制操作,建议读者使用不同的方式复制数组,并在复制数组后尝试修改数组中的元素,以深入了解这些操作的行为。

后端开发标签