Eu tenho um array numpy como este:
arr = np.array([
[1, 2, 3],
[4, -5, 6],
[-1, -1, -1]
])
E eu gostaria de argsortá-lo, mas com uma arr <= 0
máscara. A saída deve ser:
array([[0, 1, 2],
[0, 2], # (Note that the indices are still relative to original un-masked array)
[]])
Entretanto, a saída que obtenho usando np.ma.argsort()
é:
array([[0, 1, 2],
[0, 2, 1],
[0, 1, 2]])
A abordagem precisa ser muito eficiente porque o array real tem milhões de colunas. Estou pensando que isso precisa ser uma síntese de algumas operações, mas não sei quais.
A
np.where
abordagem:Matriz de entrada
Máscara de elementos válidos
Pré-alocar o resultado como uma matriz de objetos para conter índices de comprimento variável
Máscara eficiente
argsort
para cada linhaSaída:
A
np.flatnonzero
abordagem:Uma abordagem mais otimizada usando operações vetorizadas:
Comparação:
Tentei alguns outros métodos, mas eles não foram eficientes.