numpy np.array的np. array的深层副本

czfnxgou  于 2023-11-18  发布在  其他
关注(0)|答案(7)|浏览(117)

我有一个不同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是最好的方法吗?是否有一个我遗漏的深度复制函数?与这个不同大小的数组中的每个元素交互的最佳方法是什么?

gdrx4gfi

gdrx4gfi1#

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)

字符串
请随意阅读更多关于这个here
这里是最简单的测试案例:

a[0][0,0]
print a[0][0,0], array_of_arrays[0][0,0]

f8rj6qna

f8rj6qna2#

只使用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

3wabscal

3wabscal3#

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)使它成为二维的;如果它有4个元素,你可以做array_of_arrays.reshape(2,2)。有时这很方便;有时这是一个痛苦(它更难解释)。

pbpqsu0x

pbpqsu0x4#

一分钟就被打败了。事实上,深度复制是这里的答案。
对于你关于索引的第二个问题:我有一种感觉,你可能更适合使用简单的列表或字典类型的数据结构。np.arrays主要是在每个数组元素都是相同类型的情况下才有意义。当然,你可以争辩说array_of_arrays中的每个元素都是另一个数组,但是将它们收集在numpy数组中而不是简单的列表中有什么好处呢?

list_of_arrays = [np.arange(a*b).reshape(a,b) for (a, b) in pairs]

字符串

zengzsys

zengzsys5#

何时警告可能的折旧:
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)

字符串

exdqitrt

exdqitrt6#

是的,您可以使用numpy.copy()函数对NumPy数组进行深度复制。您可以找到此函数here的文档。
文档提供了如何使用该函数的示例:

import numpy as np

# Create an array x, with a reference y and a copy z:
x = np.array([1, 2, 3])
y = x
z = np.copy(x)

# Modify x and check if y and z are affected:
x[0] = 10
print(x[0] == y[0])  # True
print(x[0] == z[0])  # False

字符串
也可以使用以下方法复制数组:

x = np.array([[1,2,3],[4,5,6]], order='F')
y = x.copy()
x.fill(0)
print(x == y) # [[False False False]
              #  [False False False]]


您可以找到此方法here的文档。

j0pj023g

j0pj023g7#

一个简单的np.asarray()就可以做到这一点

np.asarray(array_of_arrays)

字符串
供参考:https://numpy.org/doc/stable/reference/generated/numpy.asarray.html

相关问题