Как отсортировать эти 3D данные в python? - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть следующие данные:

  1. Группы
  2. внутри каждой группы есть ширины
  3. и каждая ширина имеет метр

например:

 Group 1:
|Width|Meters|
--------------
|144  |500   |
--------------
|142  | 450  |

Group 2:
|Width|Meters|
--------------
|140  |500   |
--------------
|156  | 450  |

Теперь мне нужно создать алгоритм сортировки, который сначала выберет группу с большей суммой метров, а затем отсортирует ширину по убыванию. Я не знаю, как сохранить эти данные? это должен быть словарь или 3d-массив? или три списка? и с правильной структурой данных, как я могу на самом деле сортировать это. Я не прошу полный код, даже если вы укажете мне правильный путь, я найду свой путь. Спасибо

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Алгоритм сортировки может быть просто создан с использованием подхода «разделяй и властвуй». Фактически сортировка групп и сортировка пар (ширина, метры) - это разные проблемы, которые мы можем решить самостоятельно.

Выбор структуры данных зависит от вас и зависит от того, что вам нужно; например, группа может быть списком именованного кортежа (ширина, метр) или, если вам нужна более высокая эффективность, массивом 2d numpy Nx2. Контейнером различных групп может быть список (или массив numpy), если вам не нужно называть группы, список (имя, данные) кортежа или имя словаря-> данные; нет строгого правила, и для каждой возможности есть свои преимущества и недостатки (например, в списке (имя, данные) может быть трудно эффективно найти данные, зная имя, но очень легко, 1 LO C, sort. Хотя словарь обеспечивает отличный способ извлечения данных, но может быть немного более грязным, чтобы его отсортировать).

Вот пример конфигурации, где я использую имя словаря-> data для хранения различных групп (который не будет отсортирован!); список, который будет содержать только названия групп в отсортированном виде; списки именованных кортежей для данных. Таким образом, я могу легко получать данные, и если я хочу посмотреть порядок, я могу получить доступ к списку имен и затем к словарю данных

from collections import namedtuple

GroupData = namedtuple("GroupData", ["Width", "Meters"])

# Container of groups:
groups = {"Group 1": [GroupData(144, 500), GroupData(142, 650)],
          "Group 2": [GroupData(140, 800), GroupData(156, 450)]}

# Sorted list of names of groups
sorted_groups = sorted([name for name in groups], 
                        key=lambda name:sum(data.Meters for data in groups[name]),
                        reverse=True)                       

# Sort each group
for group_data in groups.values():
    group_data.sort(key=lambda data:data.Width, reverse=True)

print(groups)
print(sorted_groups)
1 голос
/ 20 февраля 2020

Использование numpy:

#                 Width Meters   
data = np.array([[[144, 500],    # Group 1
                  [142, 450]],

                 [[140, 500],    # Group 2
                  [156, 460]]])

# Pick the group with the largest sum of Meters
group_index = np.argmax(data.sum(1)[:,1])
print(f'Group with the largest sum of Meters: Group {group_index + 1}')

result = data[group_index]

# sort by Width in descending order
result = result[np.argsort(result[:,0])[::-1]]

Результат:

array([[156, 460],
       [140, 500]]) 

РЕДАКТИРОВАТЬ:

data = np.array([[[144, 500],
                  [142, 450],
                  [150, 300]],  

                 [[140, 500],
                  [156, 460],
                  [145, 300]],

                 [[170, 500],
                  [180, 455],
                  [160, 300]]])

# Sort Groups by the sum of Meters
group_inds = np.argsort(data.sum(1)[:, 1])[::-1]
result = data[group_inds]

# Sort by Width in each group
result = result[np.arange(data.shape[0])[:, None], 
                np.argsort(result[..., 0], axis=1)[:,::-1]]

Результат:

array([[[156, 460],
        [145, 300],
        [140, 500]],

       [[180, 455],
        [170, 500],
        [160, 300]],

       [[150, 300],
        [144, 500],
        [142, 450]]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...