此numpy高级索引代码如何工作?

时间:2019-05-06 08:22:24

标签: 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]]

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

您正在使用两个形状相同的a来索引2d-arrays,因此输出数组的形状也将与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个索引。

因此,回到示例中,您实际上是在基于a的{​​{1}}行中进行选择,而从row的行中则选择了rows列。您可能会发现将行和列索引转换为col坐标会更直观:

(x,y)

通过相应地从(0,0), (0,2) (3,0), (3,2) 中进行选择,将得到输出数组:

a

答案 2 :(得分: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]]])

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

答案 3 :(得分:0)

分步进行:

bananaBasket.addAll(List(Orange()))

提供2d数组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的{​​{1}}值,为第二行分配a[0,0]a[0,2]的值,即:

a[3,0]

a[3,2] <- array([[ 0, 2], [ 9, 11]]) 来自哪里?它来自b[0,0]为0和a[0,0]为0的组合。

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

依此类推。