NumPy中的高级索引不一致

Vad*_*rov 6 python numpy

为什么以下索引形式会产生不同形状的输出?

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)

几乎可以肯定我错过了一些明显的东西.

use*_*ica 5

[1, 2], [3, 4]并不意味着"在一个维度中选择索引1和2,在另一个维度中选择3和4".这意味着"选择指数(1,3)和(2,4)".

您的第一个表达式选择表单位置的所有元素,a, b, c, d其中ab可以是任何索引,c并且d必须是对(1, 3)或对(2, 4).

您的第二个表达式选择表单位置的所有元素,a, b, c, d其中ab可以是任何索引,c必须在半开范围[1,3],并且d必须是3或4.与第一个不同,c和d是允许的成为(2, 3)(1, 4).


请注意,在同一索引表达式中使用基本索引和高级索引(主要是混合:和高级索引)对结果轴的顺序具有不直观的影响.最好避免混合它们.

  • 它比“pairwise”更微妙一些;这些名单是相互“广播”的。在本例中 (2,),(2,)->(2,)。如果一个是“列向量”,我们会得到一个块:“a[:, :, [[1], [2],[3]], [3, 4]]”产生 a (5,5,3, 2)数组, (2认同)

R. *_*hna 0

第一个,

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) 处。