Rem*_*emi 4 python arrays numpy
import numpy as np
a = np.zeros((3,2))
ind_row = np.array([0,1])
a[ind_row, 1]=3
Run Code Online (Sandbox Code Playgroud)
现在,a正如所料:
[[ 0. 3.]
[ 0. 3.]
[ 0. 0.]]
Run Code Online (Sandbox Code Playgroud)
我想为一个子数组赋值a[ind_row, 1],并期望能够如下所示:
a[ind_row, 1][1] = 5
Run Code Online (Sandbox Code Playgroud)
但是,这a保持不变!我为什么要这么想?
Sve*_*ach 10
这里的问题是高级索引创建了数组的副本,并且只修改了副本.(这与基本索引形成对比,后者导致查看原始数据.)
直接分配给高级切片时
a[ind_row, 1] = 3
Run Code Online (Sandbox Code Playgroud)
没有创建副本,但在使用时
a[ind_row, 1][1] = 5
Run Code Online (Sandbox Code Playgroud)
该a[ind_row, 1]部件创建一个副本,该[1]部分索引到此临时副本.副本确实已更改,但由于您没有对其进行任何引用,因此您无法看到更改,并且会立即进行垃圾回收.
这类似于切片标准Python列表(也创建副本):
>>> a = range(5)
>>> a[2:4] = -1, -2
>>> a
[0, 1, -1, -2, 4]
>>> a[2:4][1] = -3
>>> a
[0, 1, -1, -2, 4]
Run Code Online (Sandbox Code Playgroud)
显然,这个简单案例的问题的解决方案
a[ind_row[1], 1] = 5
Run Code Online (Sandbox Code Playgroud)
更复杂的案例也可以用类似的方式重写.