ValueError: не может передавать входной массив из формы (224,224,3) в форму (224,224)

У меня есть список say, temp_list со следующими свойствами:

len(temp_list) = 9260  
temp_list[0].shape = (224,224,3)  

Теперь, когда я конвертирую в массив numpy,

x = np.array(temp_list)  

Я получаю сообщение об ошибке:

ValueError: could not broadcast input array from shape (224,224,3) into shape (224,224)  

Может кто-нибудь помочь мне здесь?

Ответ 1

По крайней мере, один элемент в вашем списке не является трехмерным; или это (второе или) третье измерение не соответствует другим элементам. Если только первое измерение не совпадает, массивы все еще сопоставляются, но как отдельные объекты: не предпринимается никаких попыток согласовать их в новый (четырехмерный) массив. Некоторые примеры ниже.

То есть оскорбительная shape != (?, 224, 3) элемента shape != (?, 224, 3),
или ndim != 3? будучи неотрицательным целым числом).
Это то, что дает вам ошибку.

Вам нужно будет это исправить, чтобы иметь возможность превратить ваш список в четырехмерный (или трехмерный) массив. Без контекста невозможно сказать, хотите ли вы потерять измерение из трехмерных элементов или добавить одно к двухмерным элементам (в первом случае), или изменить второе или третье измерение (во втором случае).


Вот пример ошибки:

>>> a = [np.zeros((224,224,3)), np.zeros((224,224,3)), np.zeros((224,224))]
>>> np.array(a)
ValueError: could not broadcast input array from shape (224,224,3) into shape (224,224)

или другой тип ввода, но та же ошибка:

>>> a = [np.zeros((224,224,3)), np.zeros((224,224,3)), np.zeros((224,224,13))]
>>> np.array(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not broadcast input array from shape (224,224,3) into shape (224,224)

Или аналогично, но с другим сообщением об ошибке:

>>> a = [np.zeros((224,224,3)), np.zeros((224,224,3)), np.zeros((224,100,3))]
>>> np.array(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not broadcast input array from shape (224,224,3) into shape (224)

Но следующее будет работать, хотя и с другими результатами, чем (предположительно) предполагалось:

>>> a = [np.zeros((224,224,3)), np.zeros((224,224,3)), np.zeros((10,224,3))]
>>> np.array(a)
# long output omitted
>>> newa = np.array(a)
>>> newa.shape
3  # oops
>>> newa.dtype
dtype('O')
>>> newa[0].shape
(224, 224, 3)
>>> newa[1].shape
(224, 224, 3)
>>> newa[2].shape
(10, 224, 3)
>>> 

Ответ 2

Да, действительно @Evert ответ совершенно правильный. Кроме того, я хотел бы добавить еще одну причину, которая может столкнуться с такой ошибкой.

>>> np.array([np.zeros((20,200)),np.zeros((20,200)),np.zeros((20,200))])

Это будет прекрасно, но это приводит к ошибке:

>>> np.array([np.zeros((20,200)),np.zeros((20,200)),np.zeros((20,201))])

ValueError: could not broadcast input array from shape (20,200) into shape (20)

Нумерация numpy в списке также должна быть того же размера.

Ответ 3

Вы можете numpy.ndarray для object с помощью astype(object)

Это будет работать:

>>> a = [np.zeros((224,224,3)).astype(object), np.zeros((224,224,3)).astype(object), np.zeros((224,224,13)).astype(object)]