如何在Python中复制一个二维数组?

93

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

在我的理解中,使用y = x是很自然的。但在数组中这样做不起作用。如果我这样做并改变了y,那么x也会发生变化。我发现可以通过以下方式解决问题:y = x[:]

但是这对于二维数组不起作用。例如:

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

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

有人知道一个适当且简单的方法吗?

5个回答

132

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

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

5
赞成列表推导式版本。它对于二维数组运行良好,比 deepcopy(x) 更快。 - Eugene Yarmash

87

试试这个:

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

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


6
对于二维浮点数数组,复制无效,但深度复制有效,谢谢! - Evalds Urtans
3
copy() 不足以实现深拷贝,因为它只是浅拷贝,所以结果将是对原始行列表的引用的副本。 - Richard Whitehead

14

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

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

2
我认为你需要进行“转换”,就像这样:new_array = list(map(list, old_array)) - Fran Marzoa
距离 = list(map(lambda i: list(map(lambda j: j, i)), 图表)).我也看到过这个.... - Linus Fernandes

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

1
“你必须使用深拷贝”并不完全正确。虽然你的方法可以,但是还有更复杂(或许更快)的方式。可以参考Ryan Ye的回答。 - palsch
@palsch,我看不出我们的答案有什么区别。我的deepcopy1d2d做了同样的事情,甚至更多)))) - Artsiom Rudzenka

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接