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