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)
几乎可以确定我错过了一些显而易见的东西。
[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)
。
:
和高级索引)会对结果的轴顺序产生不直观的影响。最好避免混合使用它们。pairwise
要微妙一些;列表会被 'broadcast' 相互匹配。在这种情况下 (2,),(2,)->(2,)。如果其中一个是 '列向量',我们将得到一个块:a[:, :, [[1], [2],[3]], [3, 4]]
会产生一个 (5,5,3,2) 的数组。 - hpaulj[1,2]
和 [3,4]
都是形状为 (2,)
的数组,它们合在一起会得到一个形状为 (2,)
的单一(数组)维度。因此,在第一个结果中,您得到了 (5,5,2)
,其中最后的 (2,)
是在过程中新创建的。[3,4]
本身就会产生一个形状为 (2,)
的(数组)维度。而切片 1:3
只会将其自己(数组)维度的长度更改为 2
。因此结果是 (5,5,2,2)
。第一个,
a[:, :, [1, 2], [3, 4]]
将索引成对取出并选择以下子数组:
a[:, :, 1, 3]
a[:, :, 2, 4]
而第二个则生成所有可能的组合(并相应地进行形状调整),即
a[:, :, 1, 3]
a[:, :, 1, 4]
a[:, :, 2, 3]
a[:, :, 2, 4]
a
初始化为零阵列,而是使用np.arange
并重塑它。a = np.arange(5**4).reshape((5, 5, 5, 5))
print(a[:, :, [1, 2], [3, 4]])
输出的前几行是:
[[[ 8 14]
[ 33 39]
[ 58 64]...
而数组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]]...
所以8出现在(1,3)(在最内层的二维数组中,1表示第二行,3表示第四列),与预期相符;14出现在(2,4)。同样地,33也在下一个二维子数组中的索引(1,3)处,39在(2,4)处。
list
不是那样工作的。 - user2357112list(a[:, :, 1, 3], a[:, :, 2, 4])
和list(a[:, :, 1, 3], a[:, :, 2, 3], a[:, :, 2, 3], a[:, :, 2, 4])
这样的表达式没有任何意义。 - user2357112当您在高级索引中有多个列表时,它表示这些列表应该成对取出。相比之下,当您使用切片时,您会得到每个列表中所有切片的元素。
为了看到区别,请考虑以下示例:
>>> print(a[:, :, [1, 2, 3], [3, 4]].shape)
IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (3,) (2,)
这是因为第一个列表长度为3,而第二个长度为2。它们不匹配,因此会出现错误。
相比之下,如果您使用切片,它可以完美地工作:
>>> print(a[:, :, 1:4, [3, 4]].shape)
(5, 5, 3, 2)
为了明白为什么会出现这种情况,我们查阅the numpy indexing documentation,其中提到:
When the index consists of as many integer arrays as the array being indexed has dimensions, the indexing is straight forward, but different from slicing.
Advanced indexes always are broadcast and iterated as one:
result[i_1, ..., i_M] == x[ind_1[i_1, ..., i_M], ind_2[i_1, ..., i_M], ..., ind_N[i_1, ..., i_M]]