【问题标题】:Numpy assigning to slice, when is the array copiedNumpy分配给切片,何时复制数组
【发布时间】:2015-05-28 10:52:13
【问题描述】:

因此,使用 numpy 数组将一个分配给另一个只是复制引用: 即

import numpy as np
x = np.array([5,8])
y = x 
y += 1
x
Out: array([6, 9])

如果我想要一个深拷贝,那么我应该使用x.copy()。从更高维数组中获取视图时也是如此,例如

A=np.array([[4,10],[8,1]])
b=A[:,1]
b+=1
A
Out: array([[ 4, 11],
            [ 8,  2]])

反过来(从上面继续):

A[:,1]=b
b
Out: array([11,  2])
b+=1
A
Out: array([[ 4, 12],
            [ 8,  3]])

所以到目前为止,一切都在持续运行。但现在如果我继续做:

A[:,0] = b
A
Out: array([[12, 12],
            [ 3,  3]])
b
Out: array([12,  3])
b+=1
A
Out: array([[12, 13],
            [ 3,  4]])

我不明白为什么第一列保持不变而另一列没有?为什么第二列继续指向b数组?是否有任何规则可以决定何时在赋值时对数组进行深度复制?

【问题讨论】:

  • 我不知道python,但它看起来像c++指针。您可以将 1 个内存空间分配给多个变量(就像许多变量读取相同的内存指针)而不是 1 个变量分配给多个内存空间(1 个 var 读取多个内存指针)

标签: python numpy


【解决方案1】:

当你在做的时候

b=A[:,1]

它正在创建对底层数组的引用。 但是在这种情况下

A[:,0] = b

仅复制值。因此,在最后一条语句中,第一列保持不变,而仍然被 b 引用的第二列发生变化。 Take a look at this

【讨论】:

  • 谢谢。当我稍后执行A[:,1]=b 时,此引用不会被覆盖?感谢您提供链接,但我发现 B[:]=A 也提供了参考,而不是单独的副本。
猜你喜欢
  • 2017-03-06
  • 2018-07-30
  • 1970-01-01
  • 2017-02-21
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
  • 2016-12-19
  • 1970-01-01
相关资源
最近更新 更多