Построить очередь результатов с индексами из массива numpy nd - PullRequest
0 голосов
/ 10 марта 2020

У меня есть массив показателей формы nxWxH, где n представляет количество объектов определенного типа, а W, H обозначает ширину и высоту.

Я бы хотел бы построить приоритетную очередь, отсортированную по баллам, где каждый элемент элемента представляет собой четырехмерный кортеж: object_type, x_pos, y_pos, score.

Я не могу понять, как сделайте это правильно (и эффективно), используя как можно больше numpy, грязь для l oop, если не приемлемый ответ.

Что я пробовал:

import numpy as np

n = 5
W = H = 3

scores = np.random.random((n,W,H))

sorted_indices = np.unravel_index(np.argsort(scores), scores.shape)
sorted_scores = scores[sorted_indices]

flattened_indices = [x.flatten() for x in sorted_indices]
flattened_scores = sorted_scores.flatten()

result = np.stack((*flattened_indices, flattened_scores), axis=-1)
print(result)

Вот результат:

[[0.         0.         0.         0.11100276]
 [0.         0.         1.         0.82079624]
 [0.         0.         2.         0.88684726]
 [0.         0.         1.         0.82079624]
 [0.         0.         0.         0.11100276]
 [0.         0.         2.         0.88684726]
 [0.         0.         1.         0.82079624]
 [0.         0.         0.         0.11100276]
 [0.         0.         2.         0.88684726]
 [0.         0.         1.         0.82079624]
 [0.         0.         0.         0.11100276]
 [0.         0.         2.         0.88684726]
 [0.         0.         1.         0.82079624]
 [0.         0.         2.         0.88684726]
 [0.         0.         0.         0.11100276]
 [0.         0.         1.         0.82079624]
 [0.         0.         2.         0.88684726]
 [0.         0.         0.         0.11100276]
 [0.         0.         0.         0.11100276]
 [0.         0.         2.         0.88684726]
 [0.         0.         1.         0.82079624]
 [0.         0.         0.         0.11100276]
 [0.         0.         1.         0.82079624]
 [0.         0.         2.         0.88684726]
 [0.         0.         0.         0.11100276]
 [0.         0.         1.         0.82079624]
 [0.         0.         2.         0.88684726]
 [0.         0.         2.         0.88684726]
 [0.         0.         0.         0.11100276]
 [0.         0.         1.         0.82079624]
 [0.         0.         0.         0.11100276]
 [0.         0.         2.         0.88684726]
 [0.         0.         1.         0.82079624]
 [0.         0.         0.         0.11100276]
 [0.         0.         1.         0.82079624]
 [0.         0.         2.         0.88684726]
 [0.         0.         1.         0.82079624]
 [0.         0.         0.         0.11100276]
 [0.         0.         2.         0.88684726]
 [0.         0.         1.         0.82079624]
 [0.         0.         0.         0.11100276]
 [0.         0.         2.         0.88684726]
 [0.         0.         1.         0.82079624]
 [0.         0.         0.         0.11100276]
 [0.         0.         2.         0.88684726]]

Как видите, результаты не отсортированы. Я мог бы отсортировать еще раз, но это излишне. Я не смог получить сначала массив 4-D кортежа, который я мог бы затем отсортировать. Любое решение приемлемо, если оно эффективно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...