Python np.take返回一个具有额外奇异维数的数组

Python np.take返回一个具有额外奇异维数的数组,python,numpy,Python,Numpy,我试图用一个包含3个元素的索引集沿着0第轴分割一个数组,比如说,shape(5,10,2)。结果,我得到了一个shape(1,3,10,2)数组。在这种情况下,添加虚拟尺寸标注的原因是什么?对我来说,这似乎是一个糟糕的设计,因为使用大括号语法的普通索引不能做到这一点np.compress也有正确的行为。在NumPy中,返回数组的形状,无论是索引还是使用np.take,都会受到传递的索引形状的影响。因此,例如,如果使用二维索引数组对一维数组进行索引,将得到二维结果: >>> x

我试图用一个包含3个元素的索引集沿着
0第
轴分割一个数组,比如说,shape
(5,10,2)
。结果,我得到了一个shape
(1,3,10,2)
数组。在这种情况下,添加虚拟尺寸标注的原因是什么?对我来说,这似乎是一个糟糕的设计,因为使用大括号语法的普通索引不能做到这一点
np.compress也有正确的行为。

在NumPy中,返回数组的形状,无论是索引还是使用
np.take
,都会受到传递的索引形状的影响。因此,例如,如果使用二维索引数组对一维数组进行索引,将得到二维结果:

>>> x = np.array([9, 8, 7, 6, 5])
>>> i = np.array([[1, 3], [2, 4]])
>>> x[i]
array([[8, 6],
       [7, 5]])
这甚至适用于多维数组,除非后续维度添加到索引形状:

>>> x = np.random.rand(5, 4, 3)
>>> x[i].shape
(2, 2, 4, 3)
因此,如果您有一个形状为
(1,3)
的索引数组,则该形状将“压印”在结果上:

>>> x = np.random.rand(5, 10, 2)
>>> i = np.array([[1, 2, 3]])
>>> x[i].shape
(1, 3, 10, 2)
这相当于沿轴进行
拍摄

>>> x.take(i, axis=0).shape
(1, 3, 10, 2)
您的问题不包括任何代码,但我怀疑,当您将索引复制并粘贴到
take
中时,您复制了额外的一对方括号:

>>> x[[1, 2, 3]].shape
(3, 10, 2)
>>> x.take([[1, 2, 3]], axis=0).shape
(1, 3, 10, 2)

索引数组的形状很重要,这在使用numpy构造更复杂的表达式时非常有用。

在numpy中,返回数组的形状,无论是索引还是使用
np.take
,都会受到传递的索引形状的影响。因此,例如,如果使用二维索引数组对一维数组进行索引,将得到二维结果:

>>> x = np.array([9, 8, 7, 6, 5])
>>> i = np.array([[1, 3], [2, 4]])
>>> x[i]
array([[8, 6],
       [7, 5]])
这甚至适用于多维数组,除非后续维度添加到索引形状:

>>> x = np.random.rand(5, 4, 3)
>>> x[i].shape
(2, 2, 4, 3)
因此,如果您有一个形状为
(1,3)
的索引数组,则该形状将“压印”在结果上:

>>> x = np.random.rand(5, 10, 2)
>>> i = np.array([[1, 2, 3]])
>>> x[i].shape
(1, 3, 10, 2)
这相当于沿轴进行
拍摄

>>> x.take(i, axis=0).shape
(1, 3, 10, 2)
您的问题不包括任何代码,但我怀疑,当您将索引复制并粘贴到
take
中时,您复制了额外的一对方括号:

>>> x[[1, 2, 3]].shape
(3, 10, 2)
>>> x.take([[1, 2, 3]], axis=0).shape
(1, 3, 10, 2)

索引数组的形状很重要,这在使用numpy构造更复杂的表达式时非常有用。

是否提供一个代码片段来演示您的问题?我想您只需要
a[[1,2,3]]
。take用于更复杂的提取,并且有自己的逻辑。您的
索引集的
形状是什么?(3,)或(1,3)?如果您不想要它,“挤压”将移除它,否则下面的解释是合理的,请提供一个代码片段来演示您的问题?我想您只需要
a[[1,2,3]]
。take用于更复杂的提取,并且有自己的逻辑。您的
索引集的
形状是什么?(3,)或(1,3)?如果你不想要它,“挤压”将移除它,否则下面的解释是合理的