多維數組的下標是一個長度上與數組維數相同的元組。
a=np.arange(3*4*5).reshape(3,4,5) lidx=[[1],[2],[3]] aidx=np.array(lidx) a[lidx] # a[tuple(lidx)]; a[([0],[1],[2])] a[aidx] # a[aidx,:,:]
下標元組的所有元素都是切片和整數,它作為下標得到的原始數組的視圖,與原始數組共享數據存儲空間。
僅有整數數組作為下標,遵循以下步驟:將所有數組進行廣播(找維數最大的數組,長度不足前面補1,再找各個維數上shape的最大值,此為廣播后數組的最大值,將shape不足的部分cope已有的數組。),對於b=a[i0,i1,i2]來說,b[0,0,0]=a[i0[0,0,0],i1[0,0,0],i2[0,0,0]],注意,此時的i0,i1,i2都為廣播后的數組。
當存在切片時,如果整數數組間沒有下標,結果數組的shape為,將整數數組部分替換為廣播之后的shape。如a.shape=(3,4,5), i0與i1廣播后為(2,2,3),則a[1:3,i0,i3].shape()=(2,2,2,3)
如果下標元組中整數數組不是連續的,則數組的shape為整數數組廣播后的shape加上切片元素對應的形狀,如a[i0,:,i1].shape()=(2,2,3,4),(2,2,3)+a的第一軸的長度為4。
如果使用布爾數組作為下標對象,或下標對象含有數組,相當於用nonzero()(返回布爾數組中值不為0的元素下標)將布爾數組轉換為一組整數數組,然后用整數數組進行下標運算