-
花哨的索引(fancy indexing)
花哨的索引不同于前面的简单索引得到的标量,而是直接得到的是传递的索引数组。
且能够让我们能够快速获得并修改复杂的数组值得字数据集。
-
探索花哨的索引
花哨的索引在概念上非常简单,它意味着传递一个索引数组来一次性获得多个数组元素。
import numpy as np rand=np.random.RandomState(42) x=rand.randint(100,size=10) [x[3],x[7],x[2]] #[71,86, 14]
利用花哨的索引,结果的形状与索引数组的形状一致,而不是与被索引数组的形状一致:
import numpy as np rand=np.random.RandomState(42) x=rand.randint(100,size=10) ind=np.array([[3,7], [4,5]]) x[ind] # 上面和下面相比较 array([[71, 86], [60, 20]])
花哨的索引也对多个维度适用。下面举一个例子:
import numpy as np X=np.arange(12).reshape(3,4) [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] row=np.array([0,1,2]) column=np.array([2,1,3]) print(X[row,column]) # the output will be [ 2 5 11]
结果的第一个值是找的X[0, 2],第二个值是找的X[0, 1],第三个值是找的X[2, 3].
在花哨的索引中,索引值的配对规则会遵循python广播的规则。
所以,当一个列向量和一个行向量组合在一个索引时,会得到一个二维的结果。
-
print(X[row[:, np.newaxis], column])
# the output will be
[[ 2 1 3]
[ 6 5 7]
[10 9 11]]
上面的结果是怎么来的呢,其实就是
[[0]
[1] 与 [2,1,3] 的组合, 第一个值是X[0,2],第二个值是X[0, 1],第三个值是X[0, 3],以此类推
[2]]
也就相当于是做了个矩阵的行与列的元素组合,这里插入一下截图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5SkKKwD9-1607090425397)(C:\Users\QXY\AppData\Roaming\Typora\typora-user-images\image-20201204214350570.png)]
按照广播的规则,一个维度为13,一个维度为3 * 1,就只能变成3 3和3 * 3,这样就会变成
[[0,0, 0]
[1, 1, 1] 两个维度相同得三维数组,然后进行元素配对,从而得到一个3*3的结果矩阵
[2, 2, 2]]
值得记住的事,花哨的索引返回的值反映的事广播后的索引数组的形状,而不是被索引的数组的形状。
-
组合索引
花哨的索引可以和其他索引方案相结合起来形成更加强大的索引操作:
-
花哨的索引和简单的索引组合使用:
[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] X[2,[2,0,1]] array([10, 8, 9])
-
-
花哨的索引和切片组合使用:
[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] X[1:, [2,0,1]] array([[ 6, 4, 6], [10, 8, 9]])
-
花哨的索引和掩码的组合使用:
mask=np.array([1,0,1,0],dtype=bool) X[row[:, np.newaxis], mask] array([[ 0, 2], [ 4, 6], [ 8, 10]])
索引选项的组合可以实现非常灵活的获取和修改元素的操作。