Исправить AttributeError: объект типа ‘NoneType’ не имеет атрибута ‘Shape’

NumPy — это популярное средство для вычислений, связанных с матрицами, массивами и математическими функциями. Атрибут shape массива NumPy возвращает кортеж, показывающий размеры массива. А когда речь заходит о преобразовании и манипуляции массивами NumPy, этот атрибут имеет решающее значение.

Вот как работает атрибут shape:

Python

 

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

Вывод:

Python

 

(2, 2)

Атрибут shape также важен в pandas или OpenCV.

Вот как используется атрибут shape в OpenCV:

Python

 

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

Вывод:

Python

 

(1280, 1920, 3)

Как видно, программа выполняется и возвращает форму (1280, 1920, 3). Предоставленная информация важна, так как она позволяет представить структуру массива и, следовательно, делает возможными операции над ним.

Однако иногда, пытаясь получить доступ к атрибуту shape, вы можете столкнуться с сообщением об ошибке AttributeError: NoneType object has no attribute shape. Ошибка возникает, когда NumPy был присвоен значение None или вообще не был инициализирован. Это указывает на то, что массив определен неправильно, и поэтому вы не можете использовать его для выполнения операций.

В этой статье вы узнаете о рабочих решениях для устранения ошибки, чтобы вы могли завершить разработку с использованием библиотек обработки данных, таких как Pandas и NumPy.

Сначала мы рассмотрим решения вкратце, а затем подробно. Погрузимся в тему.

Слишком длинно? Вот быстрое решение

  • Инициализируйте массив допустимыми значениями или убедитесь, что функции не возвращают None.
  • Убедитесь, что путь к изображению или видеоточный, так как неправильный путь вызывает ошибку. Также предоставьте путь, который не содержит символы Unicode, поскольку OpenCV не поддерживает их. В качестве альтернативы измените расположение изображения или видео.
  • Добавьте assert после загрузки изображения/кадра. Другой вариант – использовать try/except для обработки ошибки.
  • Если вы используете изображения, созданные с помощью искусственного интеллекта, и сохранили их, но столкнулись с ошибкой при попытке открыть изображение, учтите, что необходимо добавить dtype=np.uint8, чтобы можно было сохранять изображения, созданные с помощью искусственного интеллекта. Кроме того, убедитесь, что камера на вашем устройстве не открыта для другой программы. Если это так, закройте программу полностью, чтобы камера была полностью посвящена текущему проекту.
  • В других случаях attributeerror возникает из-за устаревших версий OpenCV, поэтому попробуйте обновить эту версию.

1. Проверка пути

Как уже упоминалось, основной причиной ошибки является использование неправильного пути. Поэтому хорошей идеей будет проверить, существует ли путь на устройстве или нет с помощью функции os.path.exists() метода. Функция os.getcws() затем выводит текущую директорию и поэтому является важной, если вы хотели бы создать путь.

Python

 

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

2. Использование Try/Except

Ошибку также можно управлять с помощью оператора try/except. Вот как работает решение:

Python

 

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

Сначала выполнится секция try, и если будет обнаружена AttributeError, то выполнится блок except.

3. Проверка переменной на ‘None’ с использованием ‘If Else’ Statement

Для исправления ошибки необходимо определить, откуда возникает значение None. Рассмотрим распространенный случай, когда происходит ошибка; при работе с массивом NumPy. При работе с массивом NumPy ошибка может возникнуть при работе с неинициализированным массивом или массивом, которому присвоено значение None.

Например:

Python

 

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

Вывод для вышеприведенного:

Python

 

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

Можно проверить заданное выражение и определить тип переменной, которую оно возвращает, перед доступом к атрибуту формы. Использование if-else statement полезно в таких случаях, так как оно позволяет узнать shape и возвращает None, если shape не возвращает значения.

Вот пример:

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

Вывод:

Python

 

variable is Nonetype object

В случае выше мы сначала указали абсолютный путь. Блок if выполняется только тогда, когда переменная хранит допустимое значение, которое не является None, а блок else выполняется, когда значение переменной равно None. Мы получаем сообщение об ошибке переменная является объектом Nonetype, потому что путь не существует. Эти шаги работают независимо от того, какую операционную систему вы используете, так как вам просто нужно ввести путь.

4. Инициализация массива с допустимыми значениями

Еще один вариант, когда вы сталкиваетесь с ошибкой при использовании NumPy, заключается в том, чтобы убедиться, что вы используете допустимые значения. Это можно достичь, когда мы считываем данные из файла или другого источника или используем функции NumPy типа zeros и ones.

Здесь мы модифицируем код для инициализации массива нулями:

Python

 

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

Вывод:

Python

 

(3, 3)

Заключение

Хотя AttributeError: NoneType объект не имеет атрибута shape — это распространенная ошибка в программировании, существует несколько способов, которыми вы можете воспользоваться и решить ее. Важно убедиться, что перед тем, как пытаться получить атрибут формы объекта, проверьте, является ли он None. Если это None, то верните None, иначе верните shape.

Теперь вы можете решить ошибку и продолжить решение задач.

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