【问题标题】:Copying a list of numpy arrays复制 numpy 数组列表
【发布时间】:2022-01-15 23:08:30
【问题描述】:

我正在处理 numpy 数组的(列表)列表。作为一个简单的例子,考虑这段代码:

a = [np.zeros(5)]
b = a.copy()
b[0] += 1

在这里,我将一个数组列表从a 复制到b。但是,数组本身并没有被复制,所以:

print(a)
print(b)

两者都给[array([1., 1., 1., 1., 1.])]。如果我也想复制数组,我可以这样做:

b = [arr.copy() for arr in a]

a 将保持不变。这适用于简单列表,但在使用嵌套的数组列表时会变得更加复杂,其中每个列表中的数组数量并不总是相同。

是否有一种简单的方法可以复制多级列表及其包含的每个对象,而不保留对原始列表中对象的引用?基本上,我想避免嵌套循环以及处理每个单独子列表的大小。

【问题讨论】:

    标签: python numpy-ndarray nested-lists


    【解决方案1】:

    你要找的是深拷贝

    import numpy as np
    import copy
    a = [np.zeros(5)]
    b = copy.deepcopy(a)
    b[0] += 1  # a[0] is not changed
    

    这实际上是numpy doc 中推荐的用于object 数组的深拷贝的方法。

    【讨论】:

    • 正是我需要的!我想这个解决方案也可以与包含其他对象(例如数组)的自定义类一起使用?
    • 是的,确实应该,更多关于自定义对象的 deepcopy 替代方案:stackoverflow.com/questions/39028978/…
    【解决方案2】:

    你需要使用 deepcopy。

    import numpy as np
    import copy
    
    a = [np.zeros(5)]
    b = copy.deepcopy(a)
    b[0] += 1
    
    print(a)
    print(b)
    

    结果:

    [array([0., 0., 0., 0., 0.])]
    [array([1., 1., 1., 1., 1.])]
    

    【讨论】:

      猜你喜欢
      • 2015-07-12
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      相关资源
      最近更新 更多