NumPy è uno strumento popolare per il calcolo numerico che coinvolge matrici, array e funzioni matematiche. L’attributo shape
di un array NumPy restituisce una tupla che mostra le dimensioni dell’array. Quando si tratta di ridimensionare e manipolare gli array NumPy, questo attributo è cruciale.
Ecco come funziona l’attributo shape
:
import numpy as np
arr = np.array([[5, 1], [16, 33]])
print(arr.shape)
Output:
(2, 2)
L’attributo shape
è anche importante in pandas o OpenCV.
Ecco come viene utilizzato l’attributo shape
in OpenCV:
import cv2
img = cv2.imread(r'C:\Users\ADMIN.DESKTOP-KB78BPH\Desktop\New folder
(2)\2.jpg')
print(img.shape)
L’output è:
(1280, 1920, 3)
Come osservato, il programma esegue e restituisce la forma di (1280, 1920, 3). Il dettaglio fornito è importante poiché permette di presentare la struttura dell’array e quindi di eseguire operazioni su di esso.
Tuttavia, a volte potresti provare ad accedere all’attributo shape
ma finirei per ricevere il messaggio di errore AttributeError: NoneType
object has no attribute shape
. L’errore si verifica quando NumPy è stato assegnato al valore None o non è stato inizializzato affatto. Questo indica che l’array non è definito correttamente e quindi non puoi usarlo per eseguire operazioni.
In questo articolo, impari soluzioni operative per risolvere l’errore in modo da poter completare lo sviluppo utilizzando librerie di elaborazione dati come Pandas e NumPy.
Iniziamo con una panoramica delle soluzioni e successivamente approfondiamo i dettagli. Iniziamo.
Troppo lungo? Ecco una soluzione rapida
- Inizializza un array con valori validi, o assicurati che le funzioni non restituiscano
None
. - Confermare che il percorso dell’immagine o del video sia corretto poiché un percorso errato provoca un errore. Inoltre, fornire un percorso che non contenga caratteri Unicode poiché OpenCV non li supporta. In alternativa, cambia la posizione dell’immagine o del video.
- Aggiungi un assert dopo aver caricato l’immagine/fotogramma. Un’altra opzione è utilizzare try/except per gestire l’errore.
- Se stai utilizzando immagini create utilizzando l’intelligenza artificiale e le hai salvate ma hai riscontrato un errore quando hai provato a aprirle, tieni presente che devi aggiungere
dtype=np.uint8
in modo da poter salvare immagini create utilizzando l’intelligenza artificiale. Inoltre, assicurati che la fotocamera del tuo dispositivo non sia aperta a un altro programma. Se è così, chiudi il programma completamente in modo che la fotocamera sia dedicata al progetto in corso. - In altri casi, l’
attributeerror
proviene da versioni obsolete di OpenCV, quindi prova ad aggiornare questa versione.
1. Controlla il Percorso
Come accennato in precedenza, la causa principale dell’errore si verifica quando si utilizza un percorso errato. Pertanto, è una buona idea verificare se il percorso è presente sul dispositivo o meno con l’aiuto del metodo os.path.exists()
. Il funzione os.getcwd()
quindi stampa la directory attuale e quindi è fondamentale se si desidera costruire un percorso.
import os
print(os.path.exists('1.jpg'))
print(os.getcwd())
2. Utilizza Try/Except
È anche possibile gestire l’errore utilizzando la dichiarazione try/except. Ecco come funziona la soluzione:
import cv2
img = cv2.imread('1.jpg')
try:
print(img.shape)
except AttributeError:
print('The ultimate value: ', img)
Innanzitutto, il segmento try verrà eseguito e, se si verifica un AttributeError
, allora viene eseguito il blocco except.
3. Verifica se la Variabile è ‘None’ Utilizzando la Dichiarazione ‘If Else’
Per risolvere l’errore, è necessario identificare da dove proviene il valore None
. Consideriamo un caso comune in cui si verifica l’errore: quando si lavora con un array di NumPy. Quando si lavora con un array Numpy
, si può incorrere in un errore quando si utilizza un array non inizializzato o uno che è stato assegnato il valore None
.
Per esempio:
import numpy as np
arr = None
print(arr.shape)
L’output per quanto sopra è:
AttributeError: 'NoneType' object has no attribute 'shape'
È possibile verificare una determinata istruzione e determinare il tipo di variabile che restituisce prima di accedere all’attributo shape. L’utilizzo della dichiarazione if-else
è utile in tali casi, poiché ti permette di conoscere la forma
e restituisce None
quando la forma
non restituisce alcun valore.
Ecco un esempio:
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')
Output:
variable is Nonetype object
Nel caso sopra, abbiamo prima specificato il percorso assoluto. Il blocco if
viene eseguito solo quando la variabile memorizza un valore valido che non è None
, e il blocco else viene eseguito quando il valore della variabile è None. Otteniamo il messaggio di errore variable is Nonetype object
perché il percorso non esiste. I passaggi funzionano indipendentemente dal tipo di sistema operativo che si sta utilizzando, poiché è sufficiente inserire il percorso.
4. Inizializza l’Array con Valori Validi
Un’altra opzione quando si verifica un errore durante l’uso di Numpy
è assicurarsi di utilizzare valori validi. Ciò può essere ottenuto quando leggiamo dati da un file o da una fonte diversa o utilizziamo funzioni di Numpy
come zeri e uno.
Qui modifichiamo il codice per inizializzare l’array con zeri:
import numpy as np
arr = np.zeros((3, 3))
print(arr.shape)
Output:
(3, 3)
Conclusione
Mentre AttributeError: NoneType
object has no attribute shape
è comune nella programmazione, ci sono diversi modi che puoi scegliere e risolvere. La cosa importante è assicurarsi che prima di tentare di accedere all’attributo shape di un oggetto, verificare se è None
. Se è None
, allora restituisci None
altrimenti, torna a shape
.
Ora puoi risolvere l’errore e continuare a risolvere problemi.
Source:
https://dzone.com/articles/fix-attributeerror-nonetype-object-has-no-attribut