Разбить 4-мерный np.массив на 3-мерные np.массивы по 4-му измерению

#python #arrays #numpy #split #4d

#python #массивы #numpy #разделить #4d

Вопрос:

Приношу свои извинения, если на этот вопрос был дан ответ в другом месте. Я безуспешно искал два дня. Это кажется довольно простой проблемой, хотя я не могу ее решить.

У меня есть 4-мерный массив numpy формы (40, 320, 320, 8) . Этот массив представляет собой выходные данные сверточного слоя CNN, где измерение 1 представляет выходные данные для 40 входных данных модели, измерения 2 и 3 представляют выходные данные карты объектов данного фильтра, а измерение 4 представляет 8 фильтров, используемых в сверточном слое. Мой опыт работы с python все еще очень новичок.

То, что я пытаюсь сделать, это разделить этот 4-мерный массив на 8 отдельных 3-мерных массивов, где каждый новый массив соответствует одному из 8 фильтров, представленных в измерении 4.

В настоящее время я могу делать это по одному со следующим….

filter_out = squeeze(intermediate_output[:,:,:,1])

Как я могу сделать это для всех 8 (или n) одновременно?

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

1. Рассматривали ли вы возможность сделать что-то вроде groups = np.moveaxis(intermediate_output, 3, 0) . Затем вы можете использовать группы [0], группы [1] и т.д.

Ответ №1:

Поскольку вам нужен список массивов, нет никакого вреда в использовании прямого понимания.

 alist = [arr[...,i] for i in range(8)]
 

Транспонирование и перенос с list помощью не будут быстрее, поскольку list(...) выполняется только итерация по первому измерению. Разделение массива также повторяет срезы.

Нет необходимости squeeze — если не использовать np.split .

Но вам действительно нужны отдельные массивы?

Ответ №2:

Это приведет к созданию списка 3-мерных массивов:

 list(intermediate_output.transpose(3, 0, 1, 2))
 

Ответ №3:

Другая возможность:

 split_array_list = [x.squeeze() for x in np.split(my_array, my_array.shape[-1])]