关于 NumPy 数组切片何时是引用以及何时是副本的混淆

2024-04-25

如果我尝试以下操作:

>>> import numpy as np
>>> arr = np.arange(10)
>>> s = arr[2:5]
>>> s[:] = 12
>>> s, arr
(array([12, 12, 12]), array([ 0,  1, 12, 12, 12,  5,  6,  7,  8,  9]))
>>> s = s // 2
>>> s, arr
(array([6., 6., 6.]), array([ 0,  1, 12, 12, 12,  5,  6,  7,  8,  9]))

看来是第一次s只是对部分内容的引用arr,所以修改它也会改变数组(一些12s 出现在arr);但第二次,s已成为数组该部分的副本,并且arr不受影响(12s in arr不要成为6).

为什么会出现这种情况?是什么使得s = s // 2不同的?


对 Numpy 数组进行切片始终返回数组的视图(引用)。修改切片将修改原始数组。

在第二个示例中,您重新分配给名称s。这不会修改对象。 Anew创建数组来表示结果s // 2- 其中有与 没有关系原本的arr- 进而s成为该新数组的名称。

修改s就地,使用增强赋值运算符,例如//=,或者(正如您已经看到的)切片分配,例如[:]:

>>> import numpy as np
>>> arr = np.arange(10)
>>> s = arr[2:5]
>>> s, arr
(array([2, 3, 4]), array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]))
>>> s[:] = 12 # modifies the slice, and therefore the original
>>> s, arr
(array([12, 12, 12]), array([ 0,  1, 12, 12, 12,  5,  6,  7,  8,  9]))
>>> s //= 2 # modifies the slice, and therefore the original
>>> s, arr
(array([6, 6, 6]), array([0, 1, 6, 6, 6, 5, 6, 7, 8, 9]))
>>> s = s // 2 # makes a new slice (and reassigns the name), so the original is untouched
>>> s, arr
(array([3, 3, 3]), array([0, 1, 6, 6, 6, 5, 6, 7, 8, 9]))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于 NumPy 数组切片何时是引用以及何时是副本的混淆 的相关文章

随机推荐