How to sort each row of a 3D numpy array by another 2D array?

余生颓废 提交于 2020-11-29 03:04:01

问题


I have a 2D numpy array of 2D points:

np.random.seed(0)   
a = np.random.rand(3, 4, 2) # each value is a 2D point

I would like to sort each row by the norm of every point

norms = np.linalg.norm(a, axis=2) # shape(3, 4)

indices = np.argsort(norms, axis=0) # indices of each sorted row

Now I would like to create an array with the same shape and values as a. that will have each row of 2D points sorted by their norm.

How can I achieve that?

I tried variations of np.take & np.take_along_axis but with no success.

for example:

np.take(a, indices, axis=1) # shape (3,3,4,2)

This samples a 3 times, once for each row in indices. I would like to sample a just once. each row in indices has the columns that should be sampled from the corresponding row.


回答1:


If I understand you correctly, you want this:

norms = np.linalg.norm(a,axis=2) # shape(3,4)
indices = np.argsort(norms , axis=1)
np.take_along_axis(a, indices[:,:,None], axis=1)

output for your example:

[[[0.4236548  0.64589411]
  [0.60276338 0.54488318]
  [0.5488135  0.71518937]
  [0.43758721 0.891773  ]]

 [[0.07103606 0.0871293 ]
  [0.79172504 0.52889492]
  [0.96366276 0.38344152]
  [0.56804456 0.92559664]]

 [[0.0202184  0.83261985]
  [0.46147936 0.78052918]
  [0.77815675 0.87001215]
  [0.97861834 0.79915856]]]


来源:https://stackoverflow.com/questions/64235838/how-to-sort-each-row-of-a-3d-numpy-array-by-another-2d-array

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!