Преобразование 2D-массива в 3D-массив

#python #arrays #numpy

#питон #массивы #тупой

Вопрос:

У меня есть 2D-массив в формате (image, ID) , где некоторые изображения имеют одинаковый идентификатор. Например:

 data_2d = [(image1, 1) , (image2, 2),(image3, 2) , image(4, 2) , (image5,3), (image6,3)]
 

Теперь моя цель — преобразовать это в 3D-массив, используя их идентификационные номера. Чтобы быть более ясным:

 data_3d = [[(image1, 1) ] , [(image2, 2),(image3, 2) , image(4, 2)] , [(image5,3), (image6,3)]]  
 

Есть ли какой-то способ сделать это?

Ответ №1:

Используйте словарь (или defaultdict), чтобы сгруппировать кортежи по идентификатору, а затем преобразовать значения словаря в список:

 from collections import defaultdict

data_2d = [('image1', 1), ('image2', 2), ('image3', 2), ('image4', 2), ('image5', 3), ('image6', 3)]

groups = defaultdict(list)
for e in data_2d:
    groups[e[1]].append(e)

data_3d = list(groups.values())
print(data_3d)
 

Вывод

 [[('image1', 1)], [('image2', 2), ('image3', 2), ('image4', 2)], [('image5', 3), ('image6', 3)]]
 

Обратите внимание, что я меняю имена ваших переменных на строки, чтобы сделать код доступным для выполнения.

Комментарии:

1. Этот код выполняет свою работу, я получаю массив с формой (213,). Это означает, что у меня есть 213 идентификаторов, и когда я хочу получить форму каждого идентификатора, используя for i в data_3d: print(i.shape), я получаю следующую ошибку: объект ‘list’ не имеет атрибута ‘shape’. Однако, когда я использую для i в data_3d: print(i[0].shape) Я получаю форму каждого изображения, например (541, 720, 3) и т.д. как я могу это исправить?

2. Каждый элемент data_3d представляет собой список, поэтому он не имеет формы. Что именно вы пытаетесь исправить?

3. Извините, я обнаружил свою ошибку. это была опечатка. Твой ответ полностью устранил мою проблему.