Come ordinare ogni riga di un array numpy 3D da un altro array 2D?

Oct 06 2020

Ho un array numpy 2D di punti 2D:

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

Vorrei ordinare ogni riga in base alla norma di ogni punto

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

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

Ora vorrei creare un array con la stessa forma e gli stessi valori di a. che avrà ciascuna riga di punti 2D ordinata in base alla loro norma.

Come posso ottenerlo?

Ho provato le variazioni di np.take e np.take_along_axis ma senza successo.

per esempio:

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

Questo campiona a3 volte, una per ogni riga indices. Vorrei provare asolo una volta. ogni riga in indicesha le colonne che dovrebbero essere campionate dalla riga corrispondente.

Risposte

3 Ehsan Oct 07 2020 at 01:46

Se ti ho capito bene, vuoi questo:

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 per il tuo esempio:

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