2.3.1 下标对象

首先,多维数组的下标应该是一个长度和数组的维数相同的元组。如果下标元组的长度比数组的维数大,就会出错;如果小,就会在下标元组的后面补“:”,使得它的长度与数组维数相同。

如果下标对象不是元组,则NumPy会首先把它转换为元组。这种转换可能会和用户所希望的不一致,因此为了避免出现问题,请“显式”地使用元组作为下标。例如数组a是一个三维数组,下面使用一个二维列表lidx和二维数组aidx作为下标,得到的结果就不一样。

    a = np.arange(3 * 4 * 5).reshape(3, 4, 5)
    lidx = [[0], [1]]
    aidx = np.array(lidx)
         a[lidx]                a[aidx]          
    -----------------  --------------------------
    [[5, 6, 7, 8, 9]]  [[[[ 0,  1,  2,  3,  4],  
                          [ 5,  6,  7,  8,  9],  
                          [10, 11, 12, 13, 14],  
                          [15, 16, 17, 18, 19]]],
    
    
                        [[[20, 21, 22, 23, 24],  
                          [25, 26, 27, 28, 29],  
                          [30, 31, 32, 33, 34],  
                          [35, 36, 37, 38, 39]]]]

这是因为NumPy将列表lidx转换成了([0],[1]),而将数组aidx转换成了(aidx, :, :):

      a[tuple(lidx)]          a[aidx,:,:]        
    -----------------  --------------------------
    [[5, 6, 7, 8, 9]]  [[[[ 0,  1,  2,  3,  4],  
                          [ 5,  6,  7,  8,  9],  
                          [10, 11, 12, 13, 14],  
                          [15, 16, 17, 18, 19]]],
    
    
                        [[[20, 21, 22, 23, 24],  
                          [25, 26, 27, 28, 29],  
                          [30, 31, 32, 33, 34],  
                          [35, 36, 37, 38, 39]]]]

经过各种转换和添加“:”之后得到了一个标准的下标元组。它的各个元素有如下几种类型:切片、整数、整数数组和布尔数组。如果元素不是这些类型,如列表或元组,就将其转换成整数数组。

如果下标元组的所有元素都是切片和整数,那么用它作为下标得到的是原始数组的一个视图,即它和原始数组共享数据存储空间。