带有广播和布尔掩码的花式索引

问题描述 投票:0回答:1

我在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]])
python arrays numpy masking numpy-broadcasting
1个回答
0
投票

如果使用数组索引另一个数组您基本上是沿要索引的轴选择元素并将它们堆叠在一起。

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

如果使用两个数组rowcol来索引一个数组,则>]

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]])

© www.soinside.com 2019 - 2024. All rights reserved.