日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

一文帶你搞懂Numpy中的深拷貝和淺拷貝_python

作者:趙卓不凡 ? 更新時間: 2022-06-14 編程語言

1. 引言

深拷貝和淺拷貝是Python中重要的概念,本文重點介紹在NumPy中深拷貝和淺拷貝相關操作的定義和背后的原理。

閑話少說,我們直接開始吧!

2. 淺拷貝

2.1 問題引入

我們來舉個栗子,如下所示我們有兩個數組a和b,樣例代碼如下:

import numpy as np

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

print('a =', a)
print('b =', b)

輸出如下:

a = [1 2 3]
b = [1 2 3]

此時如果我們對數組a做如下改變,代碼如下:

import numpy as np

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

a [0] = 42

print('a =', a)
print('b =', b)

那么我們的問題為: 此時b的值應該為多少?

運行上述代碼后,我們得到輸出如下:

a = [42 2 3]
b = [42 2 3]

2.2 問題剖析

也許有人會覺得輸出應該為a=[42 2 3] 和 b=[1 2 3] ,但是運行上述代碼后我們發現a和b的值均發生了相應的改變。這主要是由于在Numpy中對變量的賦值操作,實際上發生的為淺拷貝。

換句話說,此時兩個變量指向同一塊內存地址,如下所示:

所以,此時如果我們修改數組original_array中的某個元素,copy_array 由于和original_array公用同一塊內存,所以其中的元素也會發生相應的變化。

3. 深拷貝

3.1 舉個栗子

如果我們想要對Numpy數組執行深拷貝,此時我們可以使用函數copy()。相關的樣例代碼如下:

import numpy as np

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

print('a =', a)
print('b =', b)

輸出如下:

a = [1 2 3]
b = [1 2 3]

此時,如果我們改變數組a中的元素,代碼如下:

import numpy as np

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

a [0] = 42

print('a =', a)
print('b =', b)

此時的代碼輸出如下:

a = [42 2 3]
b = [1 2 3]

3.2 探究原因

觀察上述輸出,我們可以清楚地看到數組a發生了改變而數組b沒有發生變化,這是由于我們使用了深拷貝。此時的內存地址如下:

由于 original_array和copy_array指向不同的內存地址空間,所以此時我們對original_array的改變并不會對copy_array帶來影響。

4. 技巧總結

經過上述對深拷貝和淺拷貝的舉例和示例,相信大家都已有了清晰的認識,接著我們對上述知識點進行總結,歸納如下:

4.1 判斷是否指向同一內存

如果我們需要知道兩個變量是否指向同一塊內存地址,我們可以方便地使用is操作。

淺拷貝示例:

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

輸出如下:

True

深拷貝示例:

a = np.array([1, 2, 3])
b = a.copy()
print(b is a)

輸出如下:

False

4.2 其他數據類型

盡管本文中所有的示例都使用了NumPy數組,但本文中所涉及的知識也適用于Python中的列表和字典等其他數據類型。

總之,我們需要時刻記載心中:在淺拷貝中,原始數組和新的數組共同執行同一塊內存;同時在深拷貝中,新的數組是原始數據的單獨的拷貝,它指向一塊新的內存地址。

5. 總結

本文重點介紹了Python中對Numpy數組操作的淺拷貝和深拷貝的概念和背后的原理,同時給出了相應的代碼示例。

原文鏈接:https://blog.csdn.net/sgzqc/article/details/124157771

欄目分類
最近更新