Numpy数组赋值与副本

mrg*_*oom 85 python arrays numpy

例如,如果我们有一个numpy数组A,并且我们想要一个具有相同元素的numpy数组B.

以下(见下文)方法有什么区别?什么时候分配额外的内存,什么时候不分配?

  1. B = A
  2. B[:] = A(和B[:]=A[:]?一样)
  3. numpy.copy(B, A)

Blc*_*ght 105

所有三个版本都做不同的事情:

  1. B = A

    这会将新名称绑定B到已命名的现有对象A.之后他们引用同一个对象,所以如果你修改了一个对象,你也会看到另一个对象的变化.

  2. B[:] = A(和B[:]=A[:]?一样)

    这会将值复制A到现有数组中B.这两个数组必须具有相同的形状才能工作.B[:] = A[:]做同样的事情(但B = A[:]会做更像1的事情).

  3. numpy.copy(B, A)

    这不是合法的语法.你可能意味着B = numpy.copy(A).这几乎与2相同,但它创建了一个新数组,而不是重用B数组.如果没有对前一个B值的其他引用,则最终结果将与2相同,但在复制期间它将临时使用更多内存.

    或许你的意思是numpy.copyto(B, A),这是合法的,相当于2?

  • @Mr_and_Mrs_D:Numpy数组的工作方式与列表不同.切片数组不会复制,只是在现有数组的数据上创建一个新视图. (13认同)
  • @mrgloom:在分割和复制其内容时,numpy数组的工作方式与列表不同。数组是存储数值的基础内存块的“视图”。进行类似“ some_array [:]”的切片将创建一个新的数组对象,但是该新对象将是与原始数组相同内存的视图,该内存不会被复制。这就是为什么我说它更像是“ B = A”。它只占用O(1)的空间和时间,而不需要真实副本中每个副本的O(n)。 (2认同)

Mai*_*mon 27

  1. B=A 创建一个参考
  2. B[:]=A 制作副本
  3. numpy.copy(B,A) 制作副本

最后两个需要额外的内存.

要制作深层副本,您需要使用 B = copy.deepcopy(A)

  • 参见第二个示例:`B [:] = A`不会对对象类型的数组进行深复制,例如`A = np.array([[1,2,3],[4 ,5]]);B = np.array([None,None],dtype ='O')`。现在尝试`B [:] = A; B [0] [0] = 99`,这将同时更改** A和B **中的第一个元素!据我所知,除了`copy.deepcopy`之外,没有其他方法可以保证深度拷贝,甚至是一个numpy数组。 (2认同)

Woe*_*itg 8

这是我唯一可行的答案:

B=numpy.array(A)
Run Code Online (Sandbox Code Playgroud)