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

时间:2018-11-05 14:48:18

标签: python arrays numpy

我有以下代码:

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与众不同?

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]