本文参考Indexing-arrays,在理解该文的基础上,本文列出了四维布尔型索引,可加深对布尔型索引的理解。
数组型索引的数组,其返回的是原始数据的副本,不是视图。
数组型索引取值必须是整数。索引中的每个值指示数组中使用哪个值代替索引。但索引值不能越界。
>>> x=np.arange(10,1,-1)
>>> x[np.array([0,3,-1,8])]
array([10,7,2,2])
>>> #一般来说,当使用数组型索引时,返回的是一个与数组型索引具有相同形状的数组。
>>> x[np.array([[1,1],[2,3]])]
array([[9,9],
[8,7]])
>>> y=np.arange(35).reshape(5,7)
>>> y[np.array([0,2,4]),np.array([0,1,2])] #等价于y[[0,2,4],[0,1,2]]
array([0,15,30])
>>> #如果数组型索引不具有相同的形状,则尝试将它们广播到相同的形状。如:
>>> y[np.array([0,2,4]),1]
array([1,15,29])
>>> y[np.array([0,2,4])]
array([[0, 1, 2, 3, 4, 5, 6],
[14,15,16,17,18,19,20],
[28,29,30,31,32,33,34]])
与数组型索引相比,布尔型索引作为切片时具有不同的处理方式。
布尔型索引必须具有与被索引数组的初始维度相同的形状。 在最直截了当的情况下,布尔型索引与被索引的数组具有相同的形状。
>>> b=y>20
>>> b
array([[False,False,False,False,False,False,False],
[False,False,False,False,False,False,False],
[False,False,False,False,False,False,False],
[ True, True, True, True, True, True, True],
[ True, True, True, True, True, True, True]])
>>> y[b] #它返回的是一个一维数组
array([21,22,23,24,25,26,27,28,29,30,31,32,33,34]) #和整数数组型索引的数组不同,布尔型数组返回的结果是一个一维数组。与数组型索引的数组一样,返回的结果是数据的副本,而不是使用切片的得到的视图。
>>> #如果y的维度大于b的维度,则返回的结果将会是多维的。如:
>>> b[:,5]
array([False,False,False,True,True])
>>> y[b[:,5]]
array([[21,22,23,24,25,26,27],
[28,29,30,31,32,33,34]])
>>> x=np.arange(30).reshape(2,3,5)
>>> b=np.array([[True,True,False],[False,True,True]])
>>> x[b]
array([[0,1,2,3,4],
[5,6,7,8,9],
[20,21,22,23,24],
[25,26,27,28,29]])
四维数组的布尔型索引如下:
>>> z=np.arange(120).reshape(2,3,4,5)
>>> b2=np.array([True,False])
>>> z[b2]
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, 32, 33, 34],
[35, 36, 37, 38, 39]],
[[40, 41, 42, 43, 44],
[45, 46, 47, 48, 49],
[50, 51, 52, 53, 54],
[55, 56, 57, 58, 59]]]])
>>> b3=np.array([[True,False,True],[False,True,False]])
>>> z[b3]
array([[[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]],
[[40, 41, 42, 43, 44],
[45, 46, 47, 48, 49],
[50, 51, 52, 53, 54],
[55, 56, 57, 58, 59]],
[[80, 81, 82, 83, 84],
[85, 86, 87, 88, 89],
[90, 91, 92, 93, 94],
[95, 96, 97, 98, 99]]])
>>> b4=np.array([[[False,False,True,False],
[False,False,True,False],
[False,False,True,False]],
[[False,False,True,False],
[False,False,True,False],
[False,False,True,False]]])
>>> z[b4]
array([[ 10, 11, 12, 13, 14],
[ 30, 31, 32, 33, 34],
[ 50, 51, 52, 53, 54],
[ 70, 71, 72, 73, 74],
[ 90, 91, 92, 93, 94],
[110, 111, 112, 113, 114]])