如何在Python中复制2D数组?

如何在Python中复制2D数组?,python,arrays,object,copy,variable-assignment,Python,Arrays,Object,Copy,Variable Assignment,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[:][:],它也没有帮助 有人知道什么是正确而简单的方法吗

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[:][:]
,它也没有帮助

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

试试这个:

from copy import copy, deepcopy
y = deepcopy(x)
我不确定,也许就足够了。

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

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

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
使用deepcopy()或copy()是一个很好的解决方案。 对于一个简单的2D数组情况

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

对于二维阵列,可以使用映射功能:

old_array = [[2, 3], [4, 5]]
# python2.*
new_array = map(list, old_array)
# python3.*
new_array = list(map(list, old_array))
我想也可能有用

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

+1为列表理解版本。它适用于2d阵列,并且比
deepcopy(x)
“您必须使用deepcopy”要快得多。总有一种更复杂但(也许)更快的方法。参见Ryan Ye的回答。你的回答很好,但这句话并不完美。@palsch,正如我所看到的,我们的回答没有区别。我的deepcopy1d2d也做同样的事情,甚至做更多的事情)对于二维浮点数阵列复制不起作用,但是deepcopy确实起作用,谢谢!我认为您需要“转换”它,就像new_array=list(map(list,old_array))