3

我正在学习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 equals [[0,2],[9,11]]

4

4 回答 4

4

当使用数组或“类数组”完成索引以访问/修改数组的元素时,称为高级索引。

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
于 2019-05-06T08:49:36.943 回答
2

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

结果[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索引的数组。

因此,回到您的示例,您实际上是从abased on的行中进行选择row,并且从rows您选择某些列的行中进行选择col(x,y)您可能会发现将行和列索引转换为坐标更直观:

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

其中,通过从 中进行相应选择a,得到输出数组:

print(a[row,col])

array([[ 0,  2],
       [ 9, 11]])
于 2019-05-06T08:49:48.807 回答
0

按步骤进行:

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]

分配b给由 给定的值a[0,0]a[0,2]对于第一行,a[3,0]对于a[3,2]第二行,即:

 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 的组合。

等等。

于 2019-05-06T08:44:04.833 回答
0

你可以通过更多的尝试来理解它,看到更多的例子。

如果您有一维索引:

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]]])

正如你所看到的,如果你在索引中建立层次结构,你也会在输出中得到它。

于 2019-05-06T08:40:13.983 回答