花式索引(Fancy indexing)是一個NumPy術語,它指的是利用整數數組進行索引。假設咱們有一個8×4數組:數組
In [117]: arr = np.empty((8, 4)) In [118]: for i in range(8): .....: arr[i] = i In [119]: arr Out[119]: array([[ 0., 0., 0., 0.], [ 1., 1., 1., 1.], [ 2., 2., 2., 2.], [ 3., 3., 3., 3.], [ 4., 4., 4., 4.], [ 5., 5., 5., 5.], [ 6., 6., 6., 6.], [ 7., 7., 7., 7.]])
爲了以特定順序選取行子集,只需傳入一個用於指定順序的整數列表或ndarray便可:spa
In [120]: arr[[4, 3, 0, 6]] Out[120]: array([[ 4., 4., 4., 4.], [ 3., 3., 3., 3.], [ 0., 0., 0., 0.], [ 6., 6., 6., 6.]])
這段代碼確實達到咱們的要求了!使用負數索引將會從末尾開始選取行:code
In [121]: arr[[-3, -5, -7]] Out[121]: array([[ 5., 5., 5., 5.], [ 3., 3., 3., 3.], [ 1., 1., 1., 1.]])
一次傳入多個索引數組會有一點特別。它返回的是一個一維數組,其中的元素對應各個索引元組:索引
In [122]: arr = np.arange(32).reshape((8, 4)) In [123]: arr Out[123]: array([[ 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]]) In [124]: arr[[1, 5, 7, 2], [0, 3, 1, 2]] Out[124]: array([ 4, 23, 29, 10])
附錄A中會詳細介紹reshape方法。方法
最終選出的是元素(1,0)、(5,3)、(7,1)和(2,2)。不管數組是多少維的,花式索引老是一維的。數據
這個花式索引的行爲可能會跟某些用戶的預期不同(包括我在內),選取矩陣的行列子集應該是矩形區域的形式纔對。下面是獲得該結果的一個辦法:co
In [125]: arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]] Out[125]: array([[ 4, 7, 5, 6], [20, 23, 21, 22], [28, 31, 29, 30], [ 8, 11, 9, 10]])
記住,花式索引跟切片不同,它老是將數據複製到新數組中。術語