Dom*_*ler 10 python arrays numpy
我有一个不同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]
Run Code Online (Sandbox Code Playgroud)
这是最好的方法吗?我错过了深层复制功能吗?在这个不同大小的数组中,每个元素的最佳交互方式是什么?
Tom*_*ota 14
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)
Run Code Online (Sandbox Code Playgroud)
请随时在此处阅读更多相关信息.
哦,这是最简单的测试用例:
a[0][0,0]
print a[0][0,0], array_of_arrays[0][0,0]
Run Code Online (Sandbox Code Playgroud)
只需使用np.array(old_array)应该适用于最新版本的 numpy
array_to_be_copy = np.zeros([3, 3])
deep_copied_array = np.array(array_to_be_copy)
Run Code Online (Sandbox Code Playgroud)
我的numpy版本:1.21.1
打了一分钟。实际上,深层复制就是这里的答案。
关于索引的第二个问题是:我觉得使用简单的列表或字典型数据结构可能会更好。np.arrays主要在每个数组元素属于同一类型时才有意义。当然,您可以争辩说array_of_arrays中的每个元素都是另一个数组,但是将它们收集在numpy数组而不是简单列表中的好处是什么?
list_of_arrays = [np.arange(a*b).reshape(a,b) for (a, b) in pairs]
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
array_of_arrays是dtype=object; 这意味着数组的每个元素都是指向内存中其他位置的对象的指针。在这种情况下,这些元素是不同大小的数组。
a = array_of_arrays[:]
Run Code Online (Sandbox Code Playgroud)
aarray_of_arrays是一个新数组,但是;的视图 也就是说,它具有相同的数据缓冲区(在本例中是指针列表)。
b = array_of_arrays[:][:]
Run Code Online (Sandbox Code Playgroud)
这只是一个视图中的一个视图。第二个[:]作用于第一个的结果。
c = np.array(array_of_arrays, copy=True)
Run Code Online (Sandbox Code Playgroud)
这与 相同array_of_arrays.copy()。c有一个新的数据缓冲区,原始数据的副本
如果我替换 的元素c,它不会影响array_of_arrays:
c[0] = np.arange(3)
Run Code Online (Sandbox Code Playgroud)
但是如果我修改 的一个元素c,它将修改array_of_arrays- 中的相同元素,因为它们都指向同一个数组。
同样的事情也适用于列表的嵌套列表。补充的array是view情况。
d = np.array([np.array(x, copy=True) for x in array_of_arrays])
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您将复制各个元素。正如其他人指出的那样,有一个deepcopy功能。它是为列表列表之类的东西而设计的,但也适用于数组。它基本上就是做你所做的事d;沿着嵌套树递归地工作。
一般来说,对象数组就像列表嵌套。一些操作跨越对象边界,例如
array_of_arrays+1
Run Code Online (Sandbox Code Playgroud)
但即使这样实际上也是
np.array([x+1 for x in array_of_arrays])
Run Code Online (Sandbox Code Playgroud)
与列表相比,对象数组添加的一件事是诸如 之类的操作reshape。 array_of_arrays.reshape(3,1)使其成为 2d;如果它有 4 个元素,你就可以做到array_of_arrays.reshape(2,2)。有时这很方便;有时却很方便。其他时候这是一种痛苦(更难迭代)。