这个 numpy 高级索引代码是如何工作的?

How this numpy advance indexing code works?

我正在学习 numpy framework.This 一段代码我不明白。

import numpy as np
a =np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])
print(a)
row = np.array([[0,0],[3,3]])
col = np.array([[0,2],[0,2]])
b = a[row,col]
print("This is b array:",b)

这个b数组returnsa数组的角值,即b等于[[0,2],[9,11]].

多尝试,多看例子,就可以理解了。

如果你有一维索引:

In [58]: np.arange(10)[np.array([1,3,4,6])]
Out[58]: array([1, 3, 4, 6])

如果是二维索引:

In [57]: np.arange(10)[np.array([[1,3],[4,6]])]
Out[57]: 
array([[1, 3],
       [4, 6]])

如果使用 3 维索引:

In [59]: np.arange(10)[np.array([[[1],[3]],[[4],[6]]])]
Out[59]: 
array([[[1],
        [3]],

       [[4],
        [6]]])

如您所见,如果您在索引中创建层次结构,您也会在输出中得到它。

按步骤进行:

import numpy as np
a = np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])

print(a)

给出二维数组a:

array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])

然后:

row = np.array([[0,0],[3,3]])

分配给二维数组 row[0,0][3,3]:

array([[0, 0],
       [3, 3]])

然后:

col = np.array([[0,2],[0,2]])

分配给二维数组 col[0,2][0,2]:

array([[0, 2],
       [0, 2]])

最后:

b = a[row,col]

将第一行 a[0,0]a[0,2]、第二行 a[3,0]a[3,2] 给出的值赋给 b,即:

 array([[ 0,  2],
       [ 9, 11]])

b[0,0] <-- a[0,0] 从何而来?它来自 row[0,0] 0 和 col[0,0] 0 的组合。

b[0,1] <-- a[0,2] 呢?它来自 row[0,1] 0 和 col[0,1] 2 的组合。

等等。

使用数组或"array-like"对数组元素进行access/modify索引时,称为高级索引。

In [37]: a
Out[37]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])

In [38]: row
Out[38]: 
array([[0, 0],
       [3, 3]])

In [39]: col
Out[39]: 
array([[0, 2],
       [0, 2]])

In [40]: a[row, col]
Out[40]: 
array([[ 0,  2],
       [ 9, 11]])

这就是你得到的。下面是解释:

              Indices of  
`a[row, col]` row  column  
   ||   ||    ||   ||
   VV   VV    VV   VV
  a[0,  0]   a[0,  2]   
  a[3,  0]   a[3,  2]
    |__________|   |
   row-idx array   |
        |__________| 
        column-idx array

您正在使用两个形状相同的 2d-arraysa 进行索引,因此您的输出数组也将具有与 colrow 相同的形状。为了更好地理解 array indexing 的工作原理,您可以查看 docs,如图所示,在给定数组的现有轴上使用 1d-arrays 进行索引的工作方式如下:

result[i_1, ..., i_M] == x[ind_1[i_1, ..., i_M], ind_2[i_1, ..., i_M], ..., ind_N[i_1, ..., i_M]]

同样的逻辑适用于在每个轴上使用 2d-arrays 进行索引的情况,但是您将拥有一个 result 数组,最多 i_N_M 个索引。

因此回到您的示例,您实际上是根据 rowa 的行中进行选择,而从那些 rows 的行中选择一些列 col .您可能会发现将行和列索引转换为 (x,y) 坐标更直观:

(0,0), (0,2)   
(3,0), (3,2)   

通过相应地从 a 中进行选择,结果是输出数组:

print(a[row,col])

array([[ 0,  2],
       [ 9, 11]])