web-dev-qa-db-fra.com

ValueError: impossible de diffuser le tableau d'entrée de la forme (224,224,3) à la forme (224,224)

J'ai une liste par exemple, temp_list avec les propriétés suivantes:

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

Maintenant, quand je convertis en tableau numpy,

x = np.array(temp_list)  

Je reçois l'erreur:

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

Quelqu'un peut m'aider ici?

35
neel

Au moins un élément de votre liste n’est pas en trois dimensions; ou bien sa (deuxième ou) troisième dimension ne correspond pas aux autres éléments. Si seule la première dimension ne correspond pas, les tableaux le sont toujours, mais en tant qu'objets individuels: aucune tentative n'est faite pour les réconcilier dans un nouveau tableau (à quatre dimensions). Quelques exemples ci-dessous.

C'est-à-dire que shape != (?, 224, 3) de l'élément incriminé,
ou ndim != 3 (avec ? étant un entier non négatif).
C'est ce qui vous donne l'erreur.

Vous devrez résoudre ce problème pour pouvoir transformer votre liste en un tableau à quatre (ou trois) dimensions. Sans contexte, il est impossible de dire si vous souhaitez perdre une dimension des éléments 3D, en ajouter une aux éléments 2D (dans le premier cas) ou modifier la deuxième ou la troisième dimension (dans le deuxième cas).


Voici un exemple de l'erreur:

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

ou, un type d'entrée différent, mais la même erreur:

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

Alternativement, similaire mais avec un message d'erreur différent:

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

Mais ce qui suit fonctionnera, mais avec des résultats différents de ceux (vraisemblablement) prévus:

>>> 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)
>>> 
46
user707650

Oui, en effet, la réponse @Evert est parfaitement correcte. De plus, j'aimerai ajouter une raison de plus qui pourrait rencontrer une telle erreur.

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

Ce sera parfaitement bien, cependant, cela conduit à une erreur:

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

Le numpy arry dans la liste, doit également avoir la même taille.

8
Jagesh Maharjan

Vous pouvez convertir numpy.ndarray en object en utilisant astype(object)

Cela fonctionnera:

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