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函数。它是为列表之类的东西而设计的,但也适用于数组。它基本上就是在递归地处理嵌套树。
通常,对象数组类似于列表嵌套。一些操作跨越对象边界,例如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)。有时候这很方便;有时候这很痛苦(很难重复)。