向量化按numpy中多维数组的Paritular元素排序
Vectorize Sort by Paritular element of multidimensional array in numpy
我有一个形状为 (1000000,3,2) 的多维数组。本质上它是 100 万组样本,每个样本是 3 个坐标(每个坐标都有一个 x 和 y 分量)。我想按每个坐标的 y 分量对每个样本进行排序。例如,如果 vecCoords 是完整数组并且我有一个样本是 vecCoords[0,:,:] = [[1,3],[2,1],[4,2]],我希望它排序为给我 [[2,1],[4,2],[1,3]]。我被矢量化了,所以它对 100 万个样本中的每一个都完成了。所以,输出形状仍然是 (1000000,3,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, 46],
[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, 1, 0],
[2, 0, 1],
[0, 1, 2]])
在一架飞机上测试这种类型:
In [159]: arr[1,idx[1],:]
Out[159]:
array([[39, 46],
[99, 58],
[35, 81]])
应用于所有平面:
In [161]: arr[np.arange(arr.shape[0])[:,None], idx,:]
Out[161]:
array([[[21, 12],
[15, 31],
[17, 88]],
[[39, 46],
[99, 58],
[35, 81]],
[[ 9, 19],
[54, 54],
[85, 71]],
[[25, 46],
[62, 61],
[74, 69]]])
虽然我已经大致了解了我的方向,但我仍然需要进行一些实验。
一个新功能应该可以使这更容易 - 尽管即使在这里我也必须尝试一些事情:
In [168]: np.take_along_axis(arr,idx[:,:,None], axis=1)
Out[168]:
array([[[21, 12],
[15, 31],
[17, 88]],
[[39, 46],
[99, 58],
[35, 81]],
[[ 9, 19],
[54, 54],
[85, 71]],
[[25, 46],
[62, 61],
[74, 69]]])
我有一个形状为 (1000000,3,2) 的多维数组。本质上它是 100 万组样本,每个样本是 3 个坐标(每个坐标都有一个 x 和 y 分量)。我想按每个坐标的 y 分量对每个样本进行排序。例如,如果 vecCoords 是完整数组并且我有一个样本是 vecCoords[0,:,:] = [[1,3],[2,1],[4,2]],我希望它排序为给我 [[2,1],[4,2],[1,3]]。我被矢量化了,所以它对 100 万个样本中的每一个都完成了。所以,输出形状仍然是 (1000000,3,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, 46],
[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, 1, 0],
[2, 0, 1],
[0, 1, 2]])
在一架飞机上测试这种类型:
In [159]: arr[1,idx[1],:]
Out[159]:
array([[39, 46],
[99, 58],
[35, 81]])
应用于所有平面:
In [161]: arr[np.arange(arr.shape[0])[:,None], idx,:]
Out[161]:
array([[[21, 12],
[15, 31],
[17, 88]],
[[39, 46],
[99, 58],
[35, 81]],
[[ 9, 19],
[54, 54],
[85, 71]],
[[25, 46],
[62, 61],
[74, 69]]])
虽然我已经大致了解了我的方向,但我仍然需要进行一些实验。
一个新功能应该可以使这更容易 - 尽管即使在这里我也必须尝试一些事情:
In [168]: np.take_along_axis(arr,idx[:,:,None], axis=1)
Out[168]:
array([[[21, 12],
[15, 31],
[17, 88]],
[[39, 46],
[99, 58],
[35, 81]],
[[ 9, 19],
[54, 54],
[85, 71]],
[[25, 46],
[62, 61],
[74, 69]]])