簡體   English   中英

np.array 的 np.array 的深拷貝

[英]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_arraysdtype=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

何時警告可能的貶值:

  1. ..\lib\site-packages\ipykernel_launcher.py:23: DeprecationWarning: elementwise comparison failed; 這將在未來引發錯誤。

我是這樣決定的:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM