У меня есть несколько изображений (они одного размера), которые я хочу поместить в массив numpy, чтобы в результате получился массив измерения (len(img_list), 1)
.
img_list = [img, img, img]
img.shape, type(img_list), len(img_list)
((1056, 2034, 3), list, 3)
Моя главная проблема заключается в том, что при использовании numpy.array()
происходит следующее:
a = np.array(img_list, dtype=np.object)
type(a), a.dtype, a.shape, a.ndim
(numpy .ndarray, dtype ('O'), (3, 1056, 2034, 3), 4)
Обратите внимание на размеры четыре, вместо двух, как и ожидалось.
Пока что лучший метод, который я нашел, чтобы получить измерение (len(img_list), 1)
, - создать пустой массив нужного измерения и затем использовать широковещательную рассылку:
a = np.empty((3,1), dtype=np.object)
type(a), a.dtype, a.shape, a
(numpy .ndarray, dtype ('O'), (3, 1), массив ([[None], [None], [None]], dtype = object))
a[:,0] = img_list
type(a), a.dtype, a.shape
(numpy .ndarray, dtype ('O'), (3, 1))
Это дает желаемый размер.
Существует ли функция numpy, которая может сделать это напрямую, не создавая сначала пустой массив?
РЕДАКТИРОВАТЬ
Я думал, что использование numpy.hstack
или numpy.stack
должно помочь. но это приводит к «неправильному» измерению:
a_stacked = np.stack(img_list)
type(a_stacked), a_stacked.dtype, a_stacked.shape, a.ndim
(numpy .ndarray, dtype ('uint8'), (3, 1056, 2034, 3), 4)
* 1 046 *
Чтобы уточнить: я бы хотел a.ndim == 2
, а не a.ndim == 4
. Другими словами, a.shape
должно быть (3,1)
, а не (3, 1056, 2034, 3)
.