花式索引是一个Numpy属于,指的是利用整数数组进行索引。有一个8*4数组。
1 In [37]: arr = np.empty((8,4)) 2 3 In [38]: for i in range(8): 4 ...: arr[i] = i 5 6 In [39]: arr 7 Out[39]: 8 array([[ 0., 0., 0., 0.], 9 [ 1., 1., 1., 1.],10 [ 2., 2., 2., 2.],11 [ 3., 3., 3., 3.],12 [ 4., 4., 4., 4.],13 [ 5., 5., 5., 5.],14 [ 6., 6., 6., 6.],15 [ 7., 7., 7., 7.]])
为了以特定顺序选取行子元素,只需传入一个用于指定顺序的整数列表或者ndarray即可。
1 In [40]: arr[[4,3,0,6]] 2 Out[40]: 3 array([[ 4., 4., 4., 4.], 4 [ 3., 3., 3., 3.], 5 [ 0., 0., 0., 0.], 6 [ 6., 6., 6., 6.]]) 7 8 In [41]: arr[[-3,-5,-7]] 9 Out[41]: 10 array([[ 5., 5., 5., 5.],11 [ 3., 3., 3., 3.],12 [ 1., 1., 1., 1.]])
一次传入多个索引数组会有一点特别。返回的是一个一维数组,其中的元素对应各个索引元素。
1 In [42]: arr = np.arange(32).reshape((8,4)) 2 3 In [43]: arr 4 Out[43]: 5 array([[ 0, 1, 2, 3], 6 [ 4, 5, 6, 7], 7 [ 8, 9, 10, 11], 8 [12, 13, 14, 15], 9 [16, 17, 18, 19],10 [20, 21, 22, 23],11 [24, 25, 26, 27],12 [28, 29, 30, 31]])13 14 In [44]: arr[[1,5,7,2],[0,3,1,2]]15 Out[44]: array([ 4, 23, 29, 10])
最终选出的是元素(1,0),(5,3),(7,1),(2,2)。
选取矩阵的行列子集应该是矩阵的形式。
1 In [48]: arr[[1,5,7,2]][:,[0,3,1,2]]2 Out[48]: 3 array([[ 4, 7, 5, 6],4 [20, 23, 21, 22],5 [28, 31, 29, 30],6 [ 8, 11, 9, 10]])
花式索引跟切片不一样,是将数据复制到新数组中。