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

Python 这个numpy高级索引代码是如何工作的?,python,python-3.x,numpy,numpy-indexing,advanced-indexing,Python,Python 3.x,Numpy,Numpy Indexing,Advanced Indexing,我正在学习numpy框架。这段代码我不懂 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数组返回a数组的角值,即b等于[[0,2],[9,11]您可以通过更多的尝试来理解它,以查

我正在学习numpy框架。这段代码我不懂

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
数组返回
a
数组的角值,即
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]])
In [59]: np.arange(10)[np.array([[[1],[3]],[[4],[6]]])]
Out[59]: 
array([[[1],
        [3]],

       [[4],
        [6]]])
对于二维索引:

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]])
In [59]: np.arange(10)[np.array([[[1],[3]],[[4],[6]]])]
Out[59]: 
array([[[1],
        [3]],

       [[4],
        [6]]])
如果使用三维索引:

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]])
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]])
然后:

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

array([[0, 0],
       [3, 3]])
然后:

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

array([[0, 2],
       [0, 2]])
最后:

b = a[row,col]
a[0,0]
a[0,2]
为第一行指定给
b
值,将
a[3,0]
a[3,2]
为第二行指定给
b
值,即:

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

当使用数组或“类似数组”进行索引时,
b[0,0]
在哪里访问/修改数组的元素,则称为高级索引

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数组为
a
编制索引,因此您的输出数组也将具有与
列和
行相同的形状。为了更好地了解
数组索引
的工作原理,您可以检查给定数组的
1d数组
在现有轴上的索引工作,如图所示:

结果[i_1,…,i_M]==x[ind_1[i_1,…,i_M],ind_2[i_1,…,i_M], …,ind_N[i_1,…,i_M]]

在每个轴上使用
2d数组
进行索引的情况下,同样的逻辑也适用,但相反,您将得到一个
结果
数组,最多包含
i\N\M
索引

因此,回到您的示例,您基本上是基于
a
行中进行选择,并且从那些
中选择一些列
。您可能会发现将行和列索引转换为
(x,y)
坐标更直观:

(0,0), (0,2)   
(3,0), (3,2)   
通过相应地从
a
中选择,将产生输出数组:

print(a[row,col])

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

你是说你不懂代码,请说得更具体些。你想干什么?你还不明白什么?提问前请阅读以下内容: