Numpy 多维数组的深拷贝

Numpy 多维数组的深拷贝

在Numpy中,可以使用np.array来创建多维数组,这些多维数组中的元素通常是数字类型,比如整型、浮点型等。在使用多维数组时,有时需要将一个多维数组复制一份,而不是仅仅将其引用赋值给另一个变量。本文将介绍如何对Numpy中的多维数组进行深度拷贝。

阅读更多:Numpy 教程

什么是深度拷贝

在Python中,如果我们将一个对象赋值给一个变量,那么实际上是将该对象的引用赋值给变量,而不是将该对象的复制粘贴。如果我们对该变量进行修改或操作,那么原始对象也会发生相应的变化。这种赋值方式称为浅拷贝。

深度拷贝是指将原始对象的所有内容复制到一个新的对象中,新对象与原始对象没有任何关系,两者在内存中是完全独立的。因此,对新对象的修改不会影响原始对象。

Numpy中的深度拷贝

在Numpy中,使用copy方法可以实现多维数组的深度拷贝。下面是一个例子:

import numpy as np

a = np.array([[1, 2], [3, 4]])
b = a.copy()
b[0][0] = 5

print(a)
print(b)
Python

输出结果为:

[[1 2]
 [3 4]]
[[5 2]
 [3 4]]
Python

可以看到,修改新数组b中的值并没有影响原始数组a

多维数组的嵌套

在实际使用中,我们可能会遇到多维数组的嵌套结构。比如:

import numpy as np

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

print(a)
print(b)
Python

输出结果为:

[[1 2]
 [3 4]]
[[[1 2]
  [3 4]]

 [[1 2]
  [3 4]]]
Python

可以看到,数组b是由两个数组a组成的数组。如果我们对数组b进行简单的复制操作:

c = b.copy()
Python

那么,数组c就是一个新的数组,其中包含原始数组b中的两个数组,但是两者在内存中是独立的。但是,如果我们修改这两个嵌套的数组中的任意一个,原始数组a也会发生相应的变化。如下所示:

c[0][0][0] = 5

print(a)
print(b)
print(c)
Python

输出结果为:

[[5 2]
 [3 4]]
[[[5 2]
  [3 4]]

 [[1 2]
  [3 4]]]
[[[5 2]
  [3 4]]

 [[1 2]
  [3 4]]]
Python

可以看到,修改数组c中的值导致了原始数组a中的对应值发生了改变。这是因为默认情况下,Numpy中的多维数组的深度拷贝只能一层层完成,对于嵌套的多维数组,只有第一层的数组能够深度拷贝。对于更深层次的数组,需要手动进行深度拷贝。

处理多维数组的嵌套

如果要对嵌套的多维数组进行深度拷贝,可以使用deepcopy方法。deepcopy方法能够递归地将对象及其子对象进行深度拷贝。下面是使用deepcopy进行深度拷贝的例子:

import copy
import numpy as np

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

print(a)
print(b)

c = copy.deepcopy(b)
c[0][0][0] = 5

print(a)
print(b)
print(c)
Python

输出结果为:

[[1 2]
 [3 4]]
[[[1 2]
  [3 4]]

 [[1 2]
  [3 4]]]
[[1 2]
 [3 4]]
[[[1 2]
  [3 4]]

 [[1 2]
  [3 4]]]
[[[5 2]
  [3 4]]

 [[1 2]
  [3 4]]]
Python

可以看到,使用deepcopy方法对数组b进行深度拷贝,可以成功地将嵌套的数组a也进行了深度拷贝,修改c中的值不会影响到原始数组a和数组b

总结

本文介绍了如何对Numpy中的多维数组进行深度拷贝,对于单层的多维数组,可以使用copy进行深度拷贝,对于嵌套的多维数组,需要使用deepcopy进行递归的深度拷贝。在实际使用中,需要注意深度拷贝和浅拷贝的区别,以避免因不当的赋值操作导致程序出现错误。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册