如何在Python中制作2D数组的副本?

时间:2011-06-30 09:43:40

标签: python arrays object copy variable-assignment

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

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

但它不适用于2D数组。例如:

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

返回[ [1000, 2], [3, 4] ]。如果我将y=x[:]替换为y = x[:][:],也无济于事。

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

5 个答案:

答案 0 :(得分:57)

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

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

答案 1 :(得分:44)

试试这个:

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

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

答案 2 :(得分:9)

对于2D阵列,可以使用 map 功能:

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

答案 3 :(得分:1)

在您的情况下(因为您使用列表列表),您必须使用deepcopy,因为'浅层复制和深层复制之间的区别仅与复合对象(包含其他对象的对象,如列表或类实例): 浅拷贝构造一个新的复合对象,然后(尽可能)将对它的引用插入到原始对象中。 深层复制构造一个新的复合对象,然后递归地将副本插入到原始对象中找到的对象。'

请注意,下面的示例只是为了向您展示一个示例(不要打我太多)如何为1d和2d阵列实现深度复制:

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

答案 4 :(得分:0)

我认为np.tile也可能有用

>>> 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]]])