原谅我,如果这是多余的或超级基本的。我从R开始学习Python/Numpy,我很难在脑子里转来转去。在
我有一个n维数组,我想用另一个n维索引值数组进行排序。我知道我可以用一个循环来包装这件事,但似乎应该有一个真正简洁的Numponic方法来击败它。下面是设置n=2的问题的示例代码:
a1 = random.standard_normal(size=[2,5])
index = array([[0,1,2,4,3] , [0,1,2,3,4] ])
现在我有一个2x5随机数数组和一个2x5索引。我已经读了大约10遍了,但是我的大脑显然没有在摸索。在
我想这会让我达到目的:
^{pr2}$但这显然只是对第一个元素重新排序(我想是因为扁平化)。在
关于如何从我现在的位置到一个按索引的元素0对a1的元素0排序的解决方案的任何提示。。。元素n?在
我还想不出如何在N维中实现这一点,但这里是二维版本:这是N维版本:
^{pr2}$其工作原理如下:
好的,让我们从一个三维数组开始。在
可以通过指定沿每个轴的索引来访问此数组的元素,如下所示:
这相当于
a[0][1][2]
,如果我们处理的是列表而不是数组,那么您将如何访问同一个元素。在Numpy让您在分割阵列时变得更加花哨:
如果我们处理的是列表,这些示例将等价于}。在
[a[0][1][2],a[1][1][2]]
和{你甚至可以省去重复的索引,numpy就会知道你想要什么。例如,上面的例子可以等价地写成:
在每个维度中切片的数组(或列表)的形状只影响返回数组的形状。换言之,numpy不关心在拉取值时,您是否尝试用shape
(2,3,4)
数组来索引数组,只是它会反馈给您一个shape(2,3,4)
数组。例如:在本例中,我们反复获取相同的元素
a[0,0,0]
,但是numpy返回的数组与我们传入的相同。在好吧,谈谈你的问题。您需要的是用
index
数组中的数字沿最后一个轴索引数组。因此,对于问题中的示例,您希望[[a[0,0],a[0,1],a[0,2],a[0,4],a[0,3]],a[1,0],a[1,1],...
您的索引数组是多维的,正如我前面所说的,这并没有告诉numpy您要从哪里提取这些索引;它只是指定了输出数组的形状。因此,在您的示例中,您需要告诉numpy,前5个值将从
a[0]
中提取,后5个值将从a[1]
中提取。容易的!在它在N维中变得很复杂,但是让我们对我上面定义的三维数组
a
来做。假设我们有以下索引数组:所以,这些值都是沿着最后一个轴的指数。我们需要告诉numpy这些数字将从第一和第二轴的索引中提取;也就是说,我们需要告诉numpy第一个轴的索引是:
第二轴的指数为:
然后我们就可以:
生成}的便捷numpy函数称为
i1
和{np.mgrid
。我在我的答案中使用了np.ogrid
,这在本例中是等价的,因为我前面谈到了numpy魔术。在希望有帮助!在
今天玩了更多之后,我发现如果我在take中使用一个mapper函数,我可以简单地解决二维版本:
我需要
map()
对a1
中的每个元素take()
当然,公认的答案解决了n维版本。然而回想起来,我认为我并不真正需要n维的解决方案,只需要二维版本。在
相关问题 更多 >
编程相关推荐