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:
import numpy as np
arr = np.array([[5, 1], [16, 33]])
print(arr.shape)
Uitvoer:
(2, 2)
De shape-eigenschap is ook belangrijk in pandas of OpenCV.
Hier is hoe de shape-eigenschap wordt gebruikt in OpenCV:
import cv2
img = cv2.imread(r'C:\Users\ADMIN.DESKTOP-KB78BPH\Desktop\New folder
(2)\2.jpg')
print(img.shape)
De uitvoer is:
(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.
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:
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:
import numpy as np
arr = None
print(arr.shape)
Het resultaat hiervoor is:
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:
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:
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:
import numpy as np
arr = np.zeros((3, 3))
print(arr.shape)
Output:
(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