У меня есть массив показателей формы 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 кортежа, который я мог бы затем отсортировать. Любое решение приемлемо, если оно эффективно.