我在Jake Vanderplas的《数据科学手册》中遇到了这段代码。对我来说,将广播与花式索引一起使用的概念尚不清楚。请解释。
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])
In[7]: X[row[:, np.newaxis], col]
Out[7]: array([[ 2, 1, 3],
[ 6, 5, 7],
[10, 9, 11]])
它说:“这里,每个行值都与每个列向量匹配,就像我们在广播算术运算时所看到的那样。例如:“
In[8]: row[:, np.newaxis] * col
Out[8]: array([[0, 0, 0],
[2, 1, 3],
[4, 2, 6]])
如果使用数组索引另一个数组您基本上是沿要索引的轴选择元素并将它们堆叠在一起。
arr55 = np.arange(25).reshape((5, 5))
arr53 = arr[:, [3, 3, 4]]
# array([[ 3, 3, 4],
# [ 8, 8, 9],
# [13, 13, 14],
# [18, 18, 19],
# [23, 23, 24]])
因此,如果使用长度为(m, n)
或长度为k
的索引对l
数组进行索引,则结果形状为:
A_nm[row, :] -> A_km
A_nm[:, col] -> A_nl
如果使用两个数组row
和col
来索引一个数组,则>]
n = 3
m = 4
X = np.arange(n*m).reshape((n, m))
row = np.array([0, 1, 2]) # k
col = np.array([2, 1, 3]) # l
X[row, :] # A_nm[row, :] -> A_km
# array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11]])
X[:, col] # A_nm[:, col] -> A_nl
# array([[ 2, 1, 3],
# [ 6, 5, 7],
# [10, 9, 11]])
X[row][:, col] # A_nm[row][:, col] -> A_km[:, col] -> A_kl
# array([[ 2, 1, 3],
# [ 6, 5, 7],
# [10, 9, 11]])
X[row[:, np.newaxis], col] # A_nm[row[:, np.newaxis], col] -> A_kl
# array([[ 2, 1, 3],
# [ 6, 5, 7],
# [10, 9, 11]])
X[row, col[:, np.newaxis]]
# array([[ 2, 6, 10],
# [ 1, 5, 9],
# [ 3, 7, 11]])