Como classificar cada linha de um array numpy 3D por outro array 2D?
Oct 06 2020
Eu tenho uma matriz numpy 2D de pontos 2D:
np.random.seed(0)
a = np.random.rand(3, 4, 2) # each value is a 2D point
Eu gostaria de classificar cada linha pela norma de cada ponto
norms = np.linalg.norm(a, axis=2) # shape(3, 4)
indices = np.argsort(norms, axis=0) # indices of each sorted row
Agora eu gostaria de criar um array com a mesma forma e valores de a. que terá cada linha de pontos 2D classificados por sua norma.
Como posso conseguir isso?
Tentei variações de np.take & np.take_along_axis, mas sem sucesso.
por exemplo:
np.take(a, indices, axis=1) # shape (3,3,4,2)
Isso faz a amostragem a3 vezes, uma para cada linha em indices. Eu gostaria de provar aapenas uma vez. cada linha indicespossui as colunas que devem ser amostradas na linha correspondente.
Respostas
3 Ehsan Oct 07 2020 at 01:46
Se bem entendi, você quer isto:
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)
saída para o seu exemplo:
[[[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]]]
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?
George Harrison ficou chateado por suas letras de 'Hurdy Gurdy Man' de Donovan não terem sido usadas