我有以下代码:
import numpy as np
arr = np.arange(10)
slice = arr[2:5]
slice[:] = 12
print(arr)
slice = slice / 2
print(arr)
输出将是:
[ 0 1 12 12 12 5 6 7 8 9]
[6. 6. 6.]
[ 0 1 12 12 12 5 6 7 8 9]
因此,slice
周围的第一次只是对arr
的一部分的引用,因此对其进行修改也将更改数组,但是第二次围绕它已成为数组该部分的副本,并且对其进行修改在arr
中没有任何区别。为什么会这样?是什么使slice = slice / 2
与众不同?
答案 0 :(得分:1)
使用切片对象建立索引始终会返回数组的视图(引用)。修改切片将修改原始数组。在第二个示例中,您将分配给slice对象。那不会修改对象。将使用指定的值(在本例中为slice / 2)创建一个新对象。如果这是所需的行为,则可以使用/=
在适当位置修改该对象,或者索引到切片([:]
)中numpy解释为修改这些索引处的条目。
答案 1 :(得分:0)
您应该使用[:]
arr = np.arange(10)
slice = arr[2:5]
slice[:] = 12
print(arr)
slice[:] = slice / 2
[ 0 1 12 12 12 5 6 7 8 9]
print(arr)
[0 1 6 6 6 5 6 7 8 9]