[英]Deep copy of a np.array of np.array
我有一個由不同 numpy 數組組成的 numpy 數組,我想制作數組的深層副本。 我發現了以下內容:
import numpy as np
pairs = [(2, 3), (3, 4), (4, 5)]
array_of_arrays = np.array([np.arange(a*b).reshape(a,b) for (a, b) in pairs])
a = array_of_arrays[:] # Does not work
b = array_of_arrays[:][:] # Does not work
c = np.array(array_of_arrays, copy=True) # Does not work
d = np.array([np.array(x, copy=True) for x in array_of_arrays])
array_of_arrays[0][0,0] = 100
print a[0][0,0], b[0][0,0], c[0][0,0], d[0][0,0]
d 是最好的方法嗎? 有沒有我錯過的深拷貝功能? 與這個不同大小數組的數組中的每個元素交互的最佳方式是什么?
import numpy as np
import copy
pairs = [(2, 3), (3, 4), (4, 5)]
array_of_arrays = np.array([np.arange(a*b).reshape(a,b) for (a, b) in pairs])
a = copy.deepcopy(array_of_arrays)
隨意閱讀更多關於這里的信息。
哦,這是最簡單的測試用例:
a[0][0,0]
print a[0][0,0], array_of_arrays[0][0,0]
被打了一分鍾。 實際上,deepcopy 就是這里的答案。
關於索引的第二個問題:我有一種感覺,在這里使用簡單的列表或字典類型的數據結構可能會更好。 np.arrays 主要在每個數組元素屬於同一類型時才有意義。 當然,您可以爭辯說 array_of_arrays 中的每個元素都是另一個數組,但是將它們收集在一個 numpy 數組而不是一個簡單的列表中有什么好處呢?
list_of_arrays = [np.arange(a*b).reshape(a,b) for (a, b) in pairs]
In [276]: array_of_arrays
Out[276]:
array([array([[0, 1, 2],
[3, 4, 5]]),
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]]),
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])], dtype=object)
array_of_arrays
是dtype=object
; 這意味着數組的每個元素都是指向內存中其他對象的指針。 在這種情況下,這些元素是不同大小的數組。
a = array_of_arrays[:]
a
是一個新數組,但是array_of_arrays
的一個視圖; 也就是說,它具有相同的數據緩沖區(在這種情況下是指針列表)。
b = array_of_arrays[:][:]
這只是一種看法。 第二個[:]
作用於第一個的結果。
c = np.array(array_of_arrays, copy=True)
這與array_of_arrays.copy()
相同。 c
有一個新的數據緩沖區,一個原件的副本
如果我替換c
的元素,它不會影響array_of_arrays
:
c[0] = np.arange(3)
但是,如果我修改c
的元素,它將修改array_of_arrays
中的相同元素 - 因為它們都指向同一個數組。
同樣的事情也適用於列表的嵌套列表。 array
添加的是view
案例。
d = np.array([np.array(x, copy=True) for x in array_of_arrays])
在這種情況下,您正在制作各個元素的副本。 正如其他人指出的那樣,有一個deepcopy
功能。 它是為諸如列表列表之類的東西而設計的,但也適用於數組。 它基本上是在做你用d
做的事情; 遞歸地沿着嵌套樹工作。
通常,對象數組類似於列表嵌套。 一些操作跨越對象邊界,例如
array_of_arrays+1
但即使這實際上是
np.array([x+1 for x in array_of_arrays])
與列表相比,對象數組添加的一件事是reshape
之類的操作。 array_of_arrays.reshape(3,1)
使其成為 2d; 如果它有 4 個元素,你可以做array_of_arrays.reshape(2,2)
。 有時這很方便; 其他時候這是一種痛苦(更難迭代)。
只需使用np.array(old_array)
應該適用於最新版本的 numpy
array_to_be_copy = np.zeros([3, 3])
deep_copied_array = np.array(array_to_be_copy)
我的 numpy 版本:1.21.1
何時警告可能的貶值:
我是這樣決定的:
import numpy as np import copy def deepCopyArrayNumPy(arrayNunpy): clone = copy.deepcopy(arrayNunpy.tolist()) return np.array(clone)
一個簡單的 np.asarray() 就可以了
np.asarray(array_of_arrays)
供參考: https ://numpy.org/doc/stable/reference/generated/numpy.asarray.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.