如何在python中复制二维数组?

How to make a copy of a 2D array in Python?

本问题已经有最佳答案,请猛点这里访问。

X是一个二维数组。我想要一个新的变量Y,它与数组X的值相同。此外,任何进一步的Y操作都不应影响X的值。

在我看来,使用y = x是很自然的。但它不适用于数组。如果我这样做,然后改变y,x也会改变。我发现这个问题可以这样解决:y = x[:]

但它不适用于二维数组。例如:

1
2
3
4
x = [[1,2],[3,4]]
y = x[:]
y[0][0]= 1000
print x

返回[ [1000, 2], [3, 4] ]。如果我用y = x[:][:]替换y=x[:],也没有帮助。

有人知道什么是正确和简单的方法吗?


使用deepcopy()或copy()是一个很好的解决方案。对于简单的二维数组情况

1
y = [row[:] for row in x]


试试这个:

1
2
from copy import copy, deepcopy
y = deepcopy(x)

我不确定,也许copy()就足够了。


对于二维数组,可以使用map函数:

1
2
3
4
5
old_array = [[2, 3], [4, 5]]
# python2.*
new_array = map(list, old_array)
# python3.*
new_array = list(map(list, old_array))


在您的情况下(因为您使用了列表列表),您必须使用deepcopy,因为'浅复制和深复制之间的差异仅与复合对象(包含其他对象的对象,如列表或类实例)相关:一个浅拷贝构造一个新的复合对象,然后(在可能的范围内)向其中插入对原始对象的引用。深度复制构造一个新的复合对象,然后递归地将原始对象的副本插入其中。

请注意,下面的示例只是为了向您展示一个示例(不要比我强很多),如何为一维和二维数组实现deepcopy:

1
2
3
4
5
6
7
8
9
arr = [[1,2],[3,4]]

deepcopy1d2d = lambda lVals: [x if not isinstance(x, list) else x[:] for x in lVals]

dst = deepcopy1d2d(arr)

dst[1][1]=150
print dst
print arr


我认为np.tile也可能有用

1
2
3
4
5
6
7
8
9
>>> a = np.array([0, 1, 2])
>>> np.tile(a, 2)
array([0, 1, 2, 0, 1, 2])
>>> np.tile(a, (2, 2))
array([[0, 1, 2, 0, 1, 2],
       [0, 1, 2, 0, 1, 2]])
>>> np.tile(a, (2, 1, 2))
array([[[0, 1, 2, 0, 1, 2]],
       [[0, 1, 2, 0, 1, 2]]])