我对在 Python 中复制 Numpy 数组的工作方式感到困惑。我从以下几点开始:
import numpy as np
p = np.array([1.0, 0.0, 1.0, 0.3])
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用以下三种方法制作 p 的“副本”:
q = p
q1 = p[:]
q2 = p.copy()
Run Code Online (Sandbox Code Playgroud)
现在我执行q1[2] = 0.2,然后检查 q、q1 和 q2 的值。我惊讶地发现 p、q 和 q1 都变成了array([1.0, 0.0, 0.2, 0.3]),而只有 q2 保持不变。我也曾经id()检查过所有四个变量(p、q、q1、q2)的地址,并且已经确认id(p) = id(q),但是id(q1) != id(p).
我的问题是,如果id(q1) != id(p),q1 的修改如何改变 p 和 q?谢谢!
因为您使用的是简单的切片操作,所以 numpy 将使用数组结果切片的共享内存视图。在本例中它是整个数组。它们被不同的Python对象引用,但底层的numpy数组是相同的。 q1只是引用的同一数组的视图p。
您可以使用检查这一点np.shared_memory。
import numpy as np
p = np.array([1.0, 0.0, 1.0, 0.3])
q1 = p[:]
np.shares_memory(p, q1)
# returns:
True
Run Code Online (Sandbox Code Playgroud)
当切片不属于整个数组时也是如此。例如:
p = np.array([1.0, 0.0, 1.0, 0.3])
q2 = p[1::2]
print(q2)
#prints:
[0. 0.3]
# setting a value of q2 changes p
q2[0] = 10.0
p
# returns:
array([ 1. , 10. , 1. , 0.3])
Run Code Online (Sandbox Code Playgroud)