为什么以下索引形式会产生不同形状的输出?
a = np.zeros((5, 5, 5, 5))
print(a[:, :, [1, 2], [3, 4]].shape)
# (5, 5, 2)
print(a[:, :, 1:3, [3, 4]].shape)
#(5, 5, 2, 2)
Run Code Online (Sandbox Code Playgroud)
几乎可以肯定我错过了一些明显的东西.
[1, 2], [3, 4]并不意味着"在一个维度中选择索引1和2,在另一个维度中选择3和4".这意味着"选择指数对(1,3)和(2,4)".
您的第一个表达式选择表单位置的所有元素,a, b, c, d其中a和b可以是任何索引,c并且d必须是对(1, 3)或对(2, 4).
您的第二个表达式选择表单位置的所有元素,a, b, c, d其中a和b可以是任何索引,c必须在半开范围[1,3],并且d必须是3或4.与第一个不同,c和d是允许的成为(2, 3)或(1, 4).
请注意,在同一索引表达式中使用基本索引和高级索引(主要是混合:和高级索引)对结果轴的顺序具有不直观的影响.最好避免混合它们.
第一个,
a[:, :, [1, 2], [3, 4]]
Run Code Online (Sandbox Code Playgroud)
成对获取索引并选择以下子数组:
a[:, :, 1, 3]
a[:, :, 2, 4]
Run Code Online (Sandbox Code Playgroud)
而第二个生成所有可能的组合(并相应地塑造它),即
a[:, :, 1, 3]
a[:, :, 1, 4]
a[:, :, 2, 3]
a[:, :, 2, 4]
Run Code Online (Sandbox Code Playgroud)
这可以通过运行以下练习来验证。a不要将其初始化为零数组,而是使用并np.arange重塑它
a = np.arange(5**4).reshape((5, 5, 5, 5))
print(a[:, :, [1, 2], [3, 4]])
Run Code Online (Sandbox Code Playgroud)
输出的前几行是
[[[ 8 14]
[ 33 39]
[ 58 64]...
Run Code Online (Sandbox Code Playgroud)
数组a本身是
[[[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[ 10 11 12 13 14]
[ 15 16 17 18 19]
[ 20 21 22 23 24]]...
Run Code Online (Sandbox Code Playgroud)
因此,8 如预期出现在 (1,3)(在最里面的 2D 数组中,1:第 2 行,3:第 4 列),而 14 出现在 (2, 4)。同样,在下一个 2D 子数组中,33 也在索引 (1,3) 处,39 也在 (2,4) 处。