#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])]