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
:
import numpy as np
arr = np.array([[5, 1], [16, 33]])
print(arr.shape)
Salida:
(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:
import cv2
img = cv2.imread(r'C:\Users\ADMIN.DESKTOP-KB78BPH\Desktop\New folder
(2)\2.jpg')
print(img.shape)
La salida es:
(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.
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:
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:
import numpy as np
arr = None
print(arr.shape)
La salida para lo anterior es:
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:
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:
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:
import numpy as np
arr = np.zeros((3, 3))
print(arr.shape)
Salida:
(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