如果我尝试以下操作:
>>> 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
的一部分,所以修改它也会改变数组(一些12
出现在arr
中);但是第二次,s
已经成为该部分数组的副本,而arr
不受影响(arr
中的12
不会成为6
)。
为什么会发生这种情况?s = s // 2
有什么不同?
2条答案
按热度按时间njthzxwz1#
切片Numpy数组总是返回数组的视图(引用)。修改切片将修改原始数组。
在第二个示例中,您重新分配名称
s
。它不会修改对象。创建一个新数组来表示s // 2
的结果-它与原始arr
没有**关系-然后s
成为该新数组的名称。要就地修改
s
,可以使用一个增广赋值运算符,比如//=
,或者(正如你已经看到的)像[:]
那样的切片赋值:4szc88ey2#
使用
[:]
将值赋回: