NumPy é uma ferramenta popular para cálculos numéricos envolvendo matrizes, arrays e funções matemáticas. O atributo shape de um array NumPy retorna uma tupla mostrando as dimensões do array. E quando se trata de remodelar e manipular arrays NumPy, esse atributo é crucial.
A seguir, como funciona o atributo shape
:
import numpy as np
arr = np.array([[5, 1], [16, 33]])
print(arr.shape)
Saída:
(2, 2)
O atributo shape também é importante em pandas ou OpenCV.
Veja como o atributo shape é usado no OpenCV:
import cv2
img = cv2.imread(r'C:\Users\ADMIN.DESKTOP-KB78BPH\Desktop\New folder
(2)\2.jpg')
print(img.shape)
A saída é:
(1280, 1920, 3)
Como observado, o programa executa e retorna a forma de (1280, 1920, 3). O detalhe fornecido é importante, pois permite apresentar a estrutura do array e, portanto, torna possível realizar operações nele.
No entanto, às vezes você pode tentar acessar o atributo shape, mas acabar recebendo a mensagem de erro AttributeError: NoneType
object has no attribute shape
. O erro ocorre quando o NumPy foi atribuído ao valor None ou não foi inicializado. Isso indica que o array não está devidamente definido e, portanto, você não pode usá-lo para realizar operações.
Neste artigo, você aprende sobre soluções de trabalho para resolver o erro para que você possa concluir o desenvolvimento usando bibliotecas de processamento de dados como Pandas e NumPy.
Primeiro abordamos as soluções em resumo e depois em detalhes. Vamos mergulhar.
Muito longo? Aqui está uma solução rápida
- Inicialize um array com valores válidos ou garanta que as funções não retornem
None
. - Confirme se o caminho da imagem ou vídeo está correto, pois um caminho incorreto acarreta um erro. Além disso, forneça um caminho que não contenha caracteres Unicode, já que o OpenCV não suporta tais caracteres. Como alternativa, mude a localização da imagem ou vídeo.
- Adicione uma afirmação após carregar a imagem/frame. Outra opção é usar try/except para lidar com o erro.
- Se você estiver usando imagens criadas por inteligência artificial e as salvou, mas encontrou um erro ao tentar abrir a imagem, note que você precisa adicionar
dtype=np.uint8
para que possa salvar imagens criadas por inteligência artificial. Além disso, verifique se a câmera do seu dispositivo não está aberta para outro programa. Se estiver, feche o programa inteiramente para que a câmera seja dedicada ao projeto em questão. - Em outros casos, o
AttributeError
surge de versões desatualizadas do OpenCV, portanto, tente atualizar essa versão.
1. Verificar Caminho
Como mencionado anteriormente, a principal causa do erro é ao usar um caminho incorreto. Portanto, é uma boa ideia verificar se o caminho está presente no dispositivo ou não com a ajuda do método os.path.exists()
. O método os.getcwd()
então imprime o diretório atual e, portanto, é fundamental se você deseja construir um caminho.
import os
print(os.path.exists('1.jpg'))
print(os.getcwd())
2. Usar Try/Except
Também é possível gerenciar o erro usando a declaração try/except. Aqui está como a solução funciona:
import cv2
img = cv2.imread('1.jpg')
try:
print(img.shape)
except AttributeError:
print('The ultimate value: ', img)
Primeiro, o segmento try será executado, e se um AttributeError
for encontrado, então o bloco except é executado.
3. Verificar se a Variável é ‘None’ Usando a Declaração ‘If Else’
Para corrigir o erro, você precisa identificar de onde vem o valor None
. Vamos considerar um caso comum onde o erro ocorre; ao trabalhar com uma matriz NumPy. Ao trabalhar com uma matriz NumPy
, você pode receber o erro ao trabalhar com uma matriz não inicializada ou uma que foi atribuída o valor None
.
Por exemplo:
import numpy as np
arr = None
print(arr.shape)
A saída para o exemplo acima é:
AttributeError: 'NoneType' object has no attribute 'shape'
Você pode verificar uma determinada instrução e determinar o tipo de variável que ela retorna antes de acessar o atributo de forma. O uso da declaração if-else
é útil nestes casos, pois permite saber a forma
e retorna None
quando a forma
não retorna nenhum valor.
Aqui está um exemplo:
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')
Saída:
variable is Nonetype object
No caso acima, especificamos primeiro o caminho absoluto. O bloco if
executa apenas quando a variável armazena um valor válido que não é None
, e o bloco else executa quando o valor da variável é None. Recebemos a mensagem de erro variable is Nonetype object
porque o caminho não existe. Os passos funcionam independentemente do tipo de sistema operacional que você está usando, pois você só precisa inserir o caminho.
4. Inicializar Array com Valores Válidos
Outra opção quando você encontra um erro ao usar NumPy
é garantir que você use valores válidos. Isso pode ser alcançado quando lemos dados de um arquivo ou de uma fonte diferente ou usamos funções do NumPy
como zeros e uns.
Aqui modificamos o código para inicializar o array com zeros:
import numpy as np
arr = np.zeros((3, 3))
print(arr.shape)
Saída:
(3, 3)
Conclusão
Embora AttributeError: NoneType
objeto não tem atributo shape
seja comum em programação, existem várias maneiras de optar e solucioná-lo. O importante é garantir que, antes de tentar acessar o atributo shape de um objeto, verifique se ele é None
. Se for None
, então retorne None
senão, retorne ao shape
.
Agora você pode resolver o erro e continuar resolvendo problemas.
Source:
https://dzone.com/articles/fix-attributeerror-nonetype-object-has-no-attribut