ValueError: kon invoerarray niet uitzenden van vorm (224,224,3) naar vorm (224,224)

Ik heb een lijst, zeg, temp_list met de volgende eigenschappen:

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

Als ik nu converteer naar een numpy-array,

x = np.array(temp_list)  

Ik krijg de foutmelding:

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

Kan iemand me hier helpen?


Antwoord 1, autoriteit 100%

Ten minste één item in uw lijst is niet driedimensionaal, of de tweede of derde dimensie komt niet overeen met de andere elementen. Als alleen de eerste dimensie niet overeenkomt, worden de arrays nog steeds aangepast, maar als individuele objecten wordt er geen poging gedaan om ze te verzoenen tot een nieuwe (vierdimensionale) array. Enkele voorbeelden staan hieronder:

Dat wil zeggen, de shape != (?, 224, 3),
of ndim != 3(waarbij ?een niet-negatief geheel getal is).
Dat is wat je de fout geeft.

Je moet dat oplossen om van je lijst een vier- (of drie-)dimensionale array te maken. Zonder context is het onmogelijk om te zeggen of je een dimensie van de 3D-items wilt verliezen of er een wilt toevoegen aan de 2D-items (in het eerste geval), of de tweede of derde dimensie wilt wijzigen (in het tweede geval).


Hier is een voorbeeld van de fout:

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

of ander type invoer, maar dezelfde fout:

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

Als alternatief, vergelijkbaar maar met een andere foutmelding:

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

Maar het volgende zal werken, zij het met andere resultaten dan (vermoedelijk) bedoeld:

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

Antwoord 2, autoriteit 14%

Ja, inderdaad, het antwoord van @Evert is volkomen correct.
Daarnaast wil ik nog een reden toevoegen waarom een dergelijke fout kan optreden.

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

Dit komt helemaal goed, maar dit leidt tot een fout:

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

De numpy in de lijst, moet ook dezelfde grootte hebben.


Antwoord 3, autoriteit 10%

Je kunt numpy.ndarrayverbergen tot objectmet behulp van astype(object)

Dit werkt:

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

Antwoord 4, autoriteit 5%

Ik had hetzelfde probleem omdat sommige afbeeldingen grijswaardenafbeeldingen zijn in mijn dataset, dus ik los mijn probleem op door dit te doen

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

Antwoord 5, autoriteit 2%

@aravk33’s antwoord is absoluut correct.

Ik had hetzelfde probleem. Ik had een dataset van 2450 afbeeldingen. Ik kon er gewoon niet achter komen waarom ik met dit probleem werd geconfronteerd.

Controleer de afmetingen van alle afbeeldingen in uw trainingsgegevens.

Voeg het volgende fragment toe terwijl u uw afbeelding aan uw lijst toevoegt:

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

Antwoord 6, autoriteit 2%

Deze methode hoeft nietdtype te wijzigen of uw numpy-array te rafelen.

Het kernidee is:
1. initialiseer met een extra rij.
2. verander de lijst (die nog een rij heeft) in array
3.verwijder de extra rij in de resultatenarray
bijv.

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

Inderdaad, het is niet per se nodig om nog een rij toe te voegen, zolang je maar kunt ontsnappen aan het gat dat wordt vermeld in het antwoord van @aravk33 en @user707650 en het extra item later kunt verwijderen, is er niets aan de hand.

Other episodes