Bagaimana cara mengurutkan setiap baris dari array numpy 3D dengan array 2D lain?

Oct 06 2020

Saya memiliki array 2D numpy dari poin 2D:

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

Saya ingin mengurutkan setiap baris berdasarkan norma di setiap poin

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

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

Sekarang saya ingin membuat array dengan bentuk dan nilai yang sama seperti a. yang akan membuat setiap baris poin 2D diurutkan berdasarkan normanya.

Bagaimana saya bisa mencapai itu?

Saya mencoba variasi np.take & np.take_along_axis tetapi tidak berhasil.

sebagai contoh:

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

Sampel ini a3 kali, sekali untuk setiap baris dalam indices. Saya hanya ingin mencicipi asekali. setiap baris indicesmemiliki kolom yang harus diambil sampelnya dari baris yang sesuai.

Jawaban

3 Ehsan Oct 07 2020 at 01:46

Jika saya memahami Anda dengan benar, Anda menginginkan ini:

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)

keluaran untuk contoh Anda:

[[[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]]]