Numpy进阶part2
1. 花哨的索引
我们知道如何利用简单的索引值(如 arr[0])、切片(如 arr[:5])和布尔掩码(如 arr[arr > 0])获得并修改部分数组。
这里介绍的花哨的索引和前面那些简单的索引非常类似,但是传递的是索引数组,而不是单个标量。花哨的索引让我们能够快速获得并修改复杂的数组值的子数据集。
1.1 探索花哨的索引
花哨的索引在概念上非常简单,它意味着传递一个索引数组来一次性获得多个数组元素。
例如以下数组:
In[1]: import numpy as np
rand = np.random.RandomState(42)
x = rand.randint(100, size=10)
print(x)
[51 92 14 71 60 20 82 86 74 74]
#假设我们希望获得三个不同的元素,可以用以下方式实现:
In[2]: [x[3], x[7], x[2]]
Out[2]: [71, 86, 14]
#另外一种方法是通过传递索引的单个列表或数组来获得同样的结果:
In[3]: ind = [3, 7, 4]
x[ind]
Out[3]: array([71, 86, 60])
利用花哨的索引,结果的形状与索引数组的形状一致,而不是与被索引数组的形状一致:
In[4]: ind = np.array([[3, 7],[4, 5]])
x[ind]
Out[4]: array([[71, 86],[60, 20]])
# 花哨的索引也对多个维度适用。假设我们有以下数组:
In[5]: X = np.arange(12).reshape((3, 4))
X
Out[5]: array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
和标准的索引方式一样,第一个索引指的是行,第二个索引指的是列:
In[6]: row = np.array([0, 1, 2])
col = np.array([2, 1, 3])
X[row, col]
Out[6]: array([ 2, 5, 11])
这里需要注意,结果的第一个值是 X[0, 2],第二个值是 X[1, 1],第三个值是 X[2, 3]。在花哨的索引中,索引值的配对遵循 2.5 节介绍过的广播的规则。因此当我们将一个列向量和一个行向量组合在一个索引中时&