2.7 花哨的索引
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]
[x[3], x[7], x[2]]
[71, 86, 14]
ind = [3, 7, 2]
x[ind]
array([71, 86, 14])
利用花哨的索引,结果的形状与索引数组一致,而不是与被索引数组的形状一致。
ind = np.array([[3, 7], [4, 5]])
x[ind]
array([[71, 86], [60, 20]])
X = np.arange(12).reshape((3, 4))
X
array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])
二维索引,对应的是行和列的索引,如果索引的维度不同,会广播后再索引。
row = np.array([0, 1, 2])
col = np.array([2, 1, 3])
X[row, col]
array([ 2, 5, 11])
X[row[:, np.newaxis], col] # 索引是3X1和1x3,先广播再索引
array([[ 2, 1, 3], [ 6, 5, 7], [10, 9, 11]])
row[:, np.newaxis], col
(array([[0], [1], [2]]), array([2, 1, 3]))
X[2, [2, 0, 1]] # 组合使用,与简单索引
array([10, 8, 9])
X[1:, [2, 0, 1]] # 组合使用,与切片
array([[ 6, 4, 5], [10, 8, 9]])
mask = np.array([1, 0, 1, 0], dtype=bool)
X[row[:, np.newaxis], mask] # 组合使用,与掩码
array([[ 0, 2], [ 4, 6], [ 8, 10]])
示例:选择随机点
花哨的索引的常见用途是从一个矩阵中选择行的子集,如有一个 N×D
的矩阵,表示在 D