ValueError: Eingabearray konnte nicht von Form (224,224,3) in Form (224,224) gesendet werden.


73

Ich habe eine Liste sagen, temp_list mit folgenden Eigenschaften:

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

Wenn ich jetzt in ein numpy-Array konvertiere,

x = np.array(temp_list)  

Ich erhalte den Fehler:

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

Kann mir hier jemand helfen?


2
Ich denke, wir müssen np.flatten ()
Aditya

2
Durch Abflachen wird die Form des Arrays verzerrt.
Neel

1
In welcher Form soll es sein? Sie versuchen, ein neues Array aus einer Liste von 3D-Arrays zu erstellen, sodass das endgültige Array 3 oder 4D sein kann. Sie können irgendwo mit np.dstack(oder np.hstackoder np.vstack) bekommen.

Ich habe bereits überprüft, alle Elemente sind 3D mit Form (224,224,3)
neel

Können Sie uns die Ausgabe von mitteilen sum([item.size for item in temp_list])?

Antworten:


79

Mindestens ein Element in Ihrer Liste ist entweder nicht dreidimensional oder seine zweite oder dritte Dimension stimmt nicht mit den anderen Elementen überein. Wenn nur die erste Dimension nicht übereinstimmt, werden die Arrays immer noch abgeglichen. Als einzelne Objekte wird jedoch kein Versuch unternommen, sie zu einem neuen (vierdimensionalen) Array abzugleichen. Einige Beispiele sind unten:

Das heißt, die säumige Elements shape != (?, 224, 3),
oder ndim != 3(mit dem ?Wesen nicht negative ganze Zahl).
Das ist es, was Ihnen den Fehler gibt.

Sie müssen das beheben, um Ihre Liste in ein vier- (oder dreidimensionales) Array verwandeln zu können. Ohne Kontext ist es unmöglich zu sagen, ob Sie eine Dimension aus den 3D-Elementen verlieren oder eine zu den 2D-Elementen hinzufügen möchten (im ersten Fall) oder die zweite oder dritte Dimension ändern möchten (im zweiten Fall).


Hier ist ein Beispiel für den Fehler:

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

oder andere Art der Eingabe, aber der gleiche Fehler:

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

Alternativ ähnlich, aber mit einer anderen Fehlermeldung:

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

Folgendes wird jedoch funktionieren, wenn auch mit anderen Ergebnissen als (vermutlich) beabsichtigt:

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

Okay, dies beantwortet, was den Fehler verursacht, aber wie man ihn behebt. Ich habe das gleiche Problem, aber in meinem Fall konvertiere ich ein Rohbild direkt in np.array mit img_to_array (), tensorflow. Daher habe ich nicht das Privileg, es in .astype (Objekt) zu konvertieren, wie von @YinJie Gao unten erwähnt. TIA
Shashank Shukla

9

Ja, tatsächlich ist die Antwort von @Evert vollkommen richtig. Darüber hinaus möchte ich noch einen weiteren Grund hinzufügen, der auf einen solchen Fehler stoßen könnte.

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

Dies ist jedoch in Ordnung. Dies führt jedoch zu Fehlern:

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

Die Anzahl der Arrys in der Liste muss ebenfalls dieselbe Größe haben.


1
Vielen Dank für diese zusätzlichen Informationen. Mein Problem ist, dass genau wie Sie erwähnt haben, die Form der inneren Ndarrays unterschiedlich ist.
Aaron Shen

2
Vielen Dank für diesen Zusatz, ich bin über genau dieses Problem gestolpert. Das Lustige ist, wenn man im zweiten Fall zwischen 20 und 200/201 wechselt, funktioniert es, was ich ziemlich verwirrend finde. Numpy erstellt in diesem Fall kein 3D-Array, sondern ein 1D-Array mit 2D-Arrays. Also ganz anderes Verhalten als eine scheinbar unschuldige Veränderung. Ein bisschen frustrierend, um ehrlich zu sein.
Cerno

7

Können Sie verdeckte numpy.ndarrayzu objectverwendenastype(object)

Das wird funktionieren:

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

1

Die Antwort von @ aravk33 ist absolut richtig.

Ich hatte das gleiche Problem. Ich hatte einen Datensatz von 2450 Bildern. Ich konnte einfach nicht herausfinden, warum ich mit diesem Problem konfrontiert war.

Überprüfen Sie die Abmessungen aller Bilder in Ihren Trainingsdaten.

Fügen Sie den folgenden Ausschnitt hinzu, während Sie Ihr Bild in Ihre Liste einfügen:

if image.shape==(1,512,512):
    trainx.append(image)

1

Ich hatte das gleiche Problem, weil einige der Bilder Graustufenbilder in meinem Datensatz sind, also löse ich mein Problem auf diese Weise

    from PIL import Image
    img = Image.open('my_image.jpg').convert('RGB')
    # a line from my program
    positive_images_array = np.array([np.array(Image.open(img).convert('RGB').resize((150, 150), Image.ANTIALIAS)) for img in images_in_yes_directory])

1

Diese Methode muss weder dtype ändern noch Ihr numpy-Array ravelen.

Die Kernidee ist: 1. Mit einer zusätzlichen Zeile initialisieren. 2. Ändern Sie die Liste (die eine weitere Zeile enthält) in Array. 3. Löschen Sie die zusätzliche Zeile im Ergebnis-Array, z

>>> a = [np.zeros((10,224)), np.zeros((10,))]
>>> np.array(a)
# this will raise error,
ValueError: could not broadcast input array from shape (10,224) into shape (10)

# but below method works
>>> a = [np.zeros((11,224)), np.zeros((10,))]
>>> b = np.array(a)
>>> b[0] = np.delete(b[0],0,0)
>>> print(b.shape,b[0].shape,b[1].shape)
# print result:(2,) (10,224) (10,)

In der Tat ist es nicht unbedingt erforderlich, eine weitere Zeile hinzuzufügen, solange Sie aus der in der Antwort von @ aravk33 und @ user707650 angegebenen Lücke entkommen und das zusätzliche Element später löschen können, ist dies in Ordnung.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.