Oplossing voor AttributeError: \’NoneType\’ object heeft geen attribuut \’Shape\’

NumPy is een populaire tool voor berekeningen met getallen die matrices, arrays en wiskundige functies omvatten. De shape-eigenschap van een NumPy-array retourneert een tuple die de dimensies van de array aangeeft. En als het gaat om het heroriënteren en manipuleren van NumPy-arrays, is deze eigenschap cruciaal.

Hier is hoe de shape eigenschap functioneert:

Python

 

import numpy as np
arr = np.array([[5, 1], [16, 33]])
print(arr.shape)

Uitvoer:

Python

 

(2, 2)

De shape-eigenschap is ook belangrijk in pandas of OpenCV.

Hier is hoe de shape-eigenschap wordt gebruikt in OpenCV:

Python

 

import cv2
img = cv2.imread(r'C:\Users\ADMIN.DESKTOP-KB78BPH\Desktop\New folder
(2)\2.jpg')
print(img.shape)

De uitvoer is:

Python

 

(1280, 1920, 3)

Zoals gezien, voert het programma uit en retourneert de vorm van (1280, 1920, 3). De gegeven informatie is belangrijk omdat het de structuur van de array weergeeft en daardoor het mogelijk maakt om er operaties op uit te voeren.

Soms kun je echter proberen de shape-eigenschap te benaderen, maar eindig je met de foutmelding AttributeError: NoneType object heeft geen eigenschap shape. De fout treedt op wanneer NumPy is toegewezen aan de waarde None of helemaal niet is geïnitialiseerd. Dit geeft aan dat de array niet correct is gedefinieerd en daarom kun je er geen operaties mee uitvoeren.

In dit artikel leert u over werkbare oplossingen voor het oplossen van de fout zodat u de ontwikkeling kunt voltooien met behulp van gegevensverwerkingsbibliotheken zoals Pandas en NumPy.

We behandelen eerst de oplossingen in een samenvatting en vervolgens in detail. Laten we erin duiken.

Te lang? Hier is een snelle oplossing

  • Initialiseer een array met geldige waarden of zorg ervoor dat functies geen None teruggeven.
  • Controleer of het afbeeldings- of videopath correct is, aangezien een incorrect pad een foutmelding oproept. Bied ook een pad aan dat geen Unicode-tekens bevat, aangezien OpenCV dit niet ondersteunt. Als alternatief kun je de locatie van de afbeelding of video wijzigen.
  • Voeg een assert toe nadat je de afbeelding/frame hebt geladen. Een andere mogelijkheid is om try/except te gebruiken om de fout te behandelen.
  • Als je afbeeldingen gebruikt die zijn gemaakt met kunstmatige intelligentie en ze hebt opgeslagen, maar een foutmelding kreeg bij het openen van de afbeelding, moet je dtype=np.uint8 toevoegen zodat je afbeeldingen kunt opslaan die zijn gemaakt met kunstmatige intelligentie. Controleer verder of de camera op je apparaat niet open is voor een ander programma. Zo ja, sluit het programma volledig zodat de camera is toegewijd aan het project dat je aan het uitvoeren bent.
  • In sommige gevallen komt de attributeerror van verouderde versies van OpenCV, dus probeer deze versie te updaten.

1. Pad Controleren

Zoals eerder genoemd, is de belangrijkste oorzaak van de fout wanneer je een incorrect pad gebruikt. Het is daarom een goed idee om te controleren of het pad aanwezig is op het apparaat of niet met behulp van de functie os.path.exists() methode. De functie os.getcws() drukt vervolgens de huidige directory af en is daarom essentieel als je een pad zou willen construeren.

Python

 

import os
print(os.path.exists('1.jpg'))
print(os.getcwd())

2. Gebruik Try/Except

Het is ook mogelijk om de fout te beheren met behulp van de try/except-statement. Hier is hoe de oplossing werkt:

Python

 

import cv2
img = cv2.imread('1.jpg')
try:
     print(img.shape)
except AttributeError:
     print('The ultimate value: ', img)

Eerst zal het try-segment worden uitgevoerd, en als een AttributeError wordt ondervonden, zal het except-blok worden uitgevoerd.

3. Controleer of de Variabele ‘None’ is met de ‘If Else’ Statement

Om de fout te verhelpen, moet je bepalen waar de None waarde vandaan komt. Laten we een veelvoorkomend geval bekijken waarbij de fout optreedt; bij het werken met een NumPy array. Bij het werken met een NumPy array, kan de fout optreden bij een niet-geïnitialiseerde array of een die de waarde None heeft gekregen.

Bijvoorbeeld:

Python

 

import numpy as np
arr = None
print(arr.shape)

Het resultaat hiervoor is:

Python

 

AttributeError: 'NoneType' object has no attribute 'shape'

Je kunt een gegeven statement controleren en bepalen welk type variabele het teruggeeft voordat je de shape-eigenschap benadert. Het gebruik van de if-else statement is in dergelijke gevallen nuttig, aangezien het je laat weten wat de shape is en None teruggeeft als de shape geen waarde oplevert.

Hier is een voorbeeld:

Python

 

import cv2
img = cv2.imread(r'C:\Users\ADMIN.DESKTOP-KB78BPH\Desktop\New folder
(5)\2.jpg')
if img is not None:
     print(img.shape)
else:
     print('variable is Nonetype object')

Uitvoer:

Python

 

variable is Nonetype object

In het geval hierboven hebben we eerst het absolute pad gespecificeerd. De if blok uitvoeren alleen wanneer de variabele een geldige waarde opslaat die niet None is, en het else blok uitvoeren wanneer de variabele waarde None is. We krijgen de foutmelding variable is Nonetype object omdat het pad niet bestaat. De stappen werken ongeacht het soort besturingssysteem dat je gebruikt, aangezien je alleen het pad hoeft in te voeren.

4. Initialiseer Array met Geldige Waarden

Een andere optie wanneer je een fout tegenkomt bij het gebruik van NumPy is dat je ervoor zorgt dat je geldige waarden gebruikt. Dit kan bereikt worden wanneer we gegevens lezen uit een bestand of een andere bron of gebruik maken van NumPy functies zoals zeros en ones.

Hier passen we de code aan om de array met nullen te initialiseren:

Python

 

import numpy as np
arr = np.zeros((3, 3))
print(arr.shape)

Output:

Python

 

(3, 3)

Conclusie

Hoewel AttributeError: NoneType object heeft geen attribuut shape veel voorkomt in programmeerwerk, zijn er verschillende manieren waarop je ervoor kunt kiezen en het op te lossen. Het belangrijkste is om ervoor te zorgen dat voordat je probeert het attribuut vorm van een object te openen, controleren of het None is. Als het None is, dan retourneer None anders, retour naar shape.

Je kunt nu de fout oplossen en doorgaan met het oplossen van problemen.

Source:
https://dzone.com/articles/fix-attributeerror-nonetype-object-has-no-attribut