Vla*_*inu 5 python arrays numpy
我有以下一段代码:
import numpy as np
arr = np.arange(10)
slice = arr[2:5]
slice[:] = 12
print(arr)
slice = slice / 2
print(arr)
Run Code Online (Sandbox Code Playgroud)
输出将是:
[ 0 1 12 12 12 5 6 7 8 9]
[6. 6. 6.]
[ 0 1 12 12 12 5 6 7 8 9]
Run Code Online (Sandbox Code Playgroud)
所以第一次slice只是对一部分的引用,arr所以修改它也会改变数组,但第二次它变成了数组那部分的副本,修改它在arr. 为什么会发生这种情况?有什么slice = slice / 2不同?
对 Numpy 数组进行切片始终返回数组的视图(引用)。修改切片将修改原始数组。
在第二个示例中,您重新分配给 name s。这不会修改对象。创建一个新数组来表示结果s // 2(与原始数组没有关系arr),然后s成为该新数组的名称。
要s就地修改,请使用增强赋值运算符,例如//=, 或(如您已经看到的)切片赋值,例如 with [:]:
>>> 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]))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1959 次 |
| 最近记录: |