Corrige AttributeError: ‘NoneType’ objeto no tiene atributo ‘Shape’

NumPy es una herramienta popular para realizar cálculos numéricos que involucran matrices, arreglos y funciones matemáticas. El atributo shape de un arreglo NumPy devuelve una tupla que muestra las dimensiones del arreglo. Y cuando se trata de remodelar y manipular arreglos NumPy, este atributo es crucial.

A continuación, se muestra cómo funciona el atributo shape:

Python

 

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

Salida:

Python

 

(2, 2)

El atributo shape también es importante en pandas o OpenCV.

A continuación, se muestra cómo se utiliza el atributo shape en OpenCV:

Python

 

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

La salida es:

Python

 

(1280, 1920, 3)

Como se observa, el programa ejecuta y devuelve la forma de (1280, 1920, 3). El detalle proporcionado es importante ya que permite presentar la estructura del arreglo y, por lo tanto, hace posible realizar operaciones en él.

Sin embargo, a veces puedes intentar acceder al atributo shape pero terminar recibiendo el mensaje de error AttributeError: NoneType object has no attribute shape. El error ocurre cuando NumPy ha sido asignado al valor None o no ha sido inicializado en absoluto. Por lo tanto, indica que el arreglo no está definido correctamente y, por lo tanto, no puedes usarlo para realizar operaciones.

En este artículo, aprendes sobre soluciones prácticas para resolver el error para que puedas completar el desarrollo utilizando bibliotecas de procesamiento de datos como Pandas y NumPy.

Primero cubrimos las soluciones en resumen y luego en detalle. ¡Adelante!

¿Demasiado largo? Aquí hay una solución rápida

  • Inicializa un arreglo con valores válidos, o asegúrate de que las funciones no devuelvan None.
  • Asegura que la ruta de la imagen o video sea precisa, ya que un camino incorrecto provoca un error. Además, proporciona una ruta que no contenga caracteres Unicode, ya que OpenCV no los soporta. Como alternativa, cambia la ubicación de la imagen o video.
  • Agrega una afirmación después de cargar la imagen/cuadro. Otra opción es usar try/except para manejar el error.
  • Si estás usando imágenes creadas con inteligencia artificial y las guardaste, pero enfrentaste un error al intentar abrir la imagen, ten en cuenta que debes agregar dtype=np.uint8 para que puedas guardar imágenes creadas con inteligencia artificial. Además, asegúrate de que la cámara de tu dispositivo no esté abierta a otro programa. Si es así, cierra el programa por completo para que la cámara esté comprometida con el proyecto en cuestión.
  • En otros casos, el attributeerror proviene de versiones obsoletas de OpenCV, así que intenta actualizar esta versión.

1. Comprobar Ruta

Como se mencionó anteriormente, la principal causa del error es cuando usas una ruta incorrecta. Por lo tanto, es una buena idea verificar si la ruta está presente en el dispositivo o no con la ayuda del método os.path.exists(). El método os.getcwd() luego imprime el directorio actual y, por lo tanto, es fundamental si deseas construir una ruta.

Python

 

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

2. Usar Try/Except

También es posible gestionar el error usando la declaración try/except. Así es como funciona la solución:

Python

 

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

Primero, se ejecutará el segmento try, y si se encuentra un AttributeError, entonces se ejecuta el bloque except.

3. Verificar si la Variable es ‘None’ Usando la Declaración ‘If Else’

Para solucionar el error, debes identificar de dónde proviene el valor None. Consideremos un caso común en el que ocurre el error; al trabajar con una matriz de NumPy. Al utilizar una matriz NumPy, puedes obtener el error al trabajar con una matriz no inicializada o una que ha sido asignada el valor None.

Por ejemplo:

Python

 

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

La salida para lo anterior es:

Python

 

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

Puedes verificar una declaración dada y determinar el tipo de variable que devuelve antes de acceder al atributo de forma. Usar la declaración if-else es útil en tales casos, ya que te permite conocer la forma y devuelve None cuando la forma no devuelve un valor.

Aquí hay un ejemplo:

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

Salida:

Python

 

variable is Nonetype object

En el caso anterior, primero especificamos la ruta absoluta. El bloque if solo se ejecuta cuando la variable almacena un valor válido que no es None, y el bloque else se ejecuta cuando el valor de la variable es None. Obtenemos el mensaje de error variable es objeto de tipo Nonetype porque la ruta no existe. Los pasos funcionan sin importar el tipo de sistema operativo que estés usando, ya que solo tienes que ingresar la ruta.

4. Inicializar la Matriz con Valores Válidos

Otra opción cuando encuentres un error al usar NumPy es asegurarte de que uses valores válidos. Esto se puede lograr cuando leemos datos de un archivo o una fuente diferente o usamos funciones de NumPy como ceros y unos.

Aquí modificamos el código para inicializar el array con ceros:

Python

 

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

Salida:

Python

 

(3, 3)

Conclusión

Si bien AttributeError: NoneType object has no attribute shape es común en la programación, hay varias formas en que puedes optar y solucionarlo. Lo importante es asegurarse de que antes de intentar acceder al atributo shape de un objeto, verifique si es None. Si es None, entonces devuelva None de lo contrario, devuelva shape.

Ahora puedes resolver el error y continuar resolviendo problemas.

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