【问题标题】:How to make a copy of a 2D array in Python? [duplicate]如何在 Python 中制作二维数组的副本? [复制]
【发布时间】:2011-09-25 20:21:41
【问题描述】:

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[:][:] 也无济于事。

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

【问题讨论】:

    标签: python arrays object copy variable-assignment


    【解决方案1】:

    对于二维数组,可以使用 ma​​p 函数:

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

    【讨论】:

    • 我认为你需要“转换”它,比如 new_array = list(map(list, old_array))
    【解决方案2】:

    我认为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]]])
    

    【讨论】:

      【解决方案3】:

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

      请注意,下面的示例只是为了向您展示一个示例(不要打我太多)如何为 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" 不是真的。总是有一种更复杂但(也许)更快的方法。见叶瑞安的回答。你的很好,但这种说法并不完美。
      • @palsch 我可以看到我们的答案没有区别。我的 deepcopy1d2d 也在做同样的事情,甚至更多))))
      【解决方案4】:

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

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

      【讨论】:

      • +1 用于列表理解版本。它适用于二维数组并且比deepcopy(x) 更快。
      【解决方案5】:

      试试这个:

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

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

      【讨论】:

      • 对于 2D 浮点数组复制不起作用,但 deepcopy 确实有效,谢谢!
      • copy() 是不够的,它是浅拷贝,因此结果将是对原始行列表的引用的副本。
      猜你喜欢
      • 2018-02-07
      • 1970-01-01
      • 2021-02-26
      • 2019-01-11
      • 1970-01-01
      • 1970-01-01
      • 2018-04-03
      • 2014-06-28
      相关资源
      最近更新 更多