在numpy中向量化按多维数组的奇偶元素排序

问题描述

我有一个多维形状的数组(1000000,3,2)。本质上是一百万个样本集,每个样本是3个坐标(每个坐标都有x和y分量)。我想按每个坐标的y分量对每个样本进行排序。例如,如果vecCoords是完整数组,而我有一个样本是vecCoords [0,:,:] = [[1,3],[2,1],[4,2]],我希望将其排序为给我[[2,2],[1,3]]。我经过了矢量化处理,因此可以对100万个样本中的每个样本进行处理。因此,输出形状仍为(1000000,2)。我尝试进行迭代,但是我的代码没有在其中给出正确的结果,而且速度也比我想要的慢。

解决方法

制作一个小样本数组:

In [153]: arr = np.random.randint(0,100,(4,3,2))
In [154]: arr
Out[154]: 
array([[[21,12],[15,31],[17,88]],[[35,81],[99,58],[39,46]],[[54,54],[85,71],[ 9,19]],[[25,46],[62,61],[74,69]]])

您要排序的值:

In [155]: arr[:,:,1]
Out[155]: 
array([[12,31,88],[81,58,[54,71,19],[46,61,69]])
In [156]: idx=np.argsort(arr[:,1],axis=1)
In [157]: idx
Out[157]: 
array([[0,1,2],[2,0],[0,2]])

在一架飞机上进行这种测试:

In [159]: arr[1,idx[1],:]
Out[159]: 
array([[39,[35,81]])

将其应用于所有飞机:

In [161]: arr[np.arange(arr.shape[0])[:,None],idx,:]
Out[161]: 
array([[[21,[[39,81]],[[ 9,71]],69]]])

虽然我对下一步工作有一个大致的了解,但我仍然必须进行一些实验。

应该有一个新颖的功能使它更容易-尽管即使在这里,我也必须尝试一些方法:

In [168]: np.take_along_axis(arr,idx[:,axis=1)
Out[168]: 
array([[[21,69]]])