Correggere AttributeError: ‘NoneType’ Object Non Ha Attributo ‘Shape’

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:

Python

 

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

Output:

Python

 

(2, 2)

L’attributo shape è anche importante in pandas o OpenCV.

Ecco come viene utilizzato l’attributo shape in OpenCV:

Python

 

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

L’output è:

Python

 

(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.

Python

 

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:

Python

 

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:

Python

 

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

L’output per quanto sopra è:

Python

 

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:

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

Output:

Python

 

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:

Python

 

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

Output:

Python

 

(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