numpy:可以将值分配给子数组吗?

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)

更复杂的案例也可以用类似的方式重写.