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?
np.dstack
(odernp.hstack
odernp.vstack
) bekommen.sum([item.size for item in temp_list])
?Antworten:
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) >>>
quelle
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.
quelle
Können Sie verdeckte
numpy.ndarray
zuobject
verwendenastype(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)]
quelle
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)
quelle
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])
quelle
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.
quelle