AttributeError: ‘NoneType’ オブジェクトには ‘shape’ 属性がありませんのエラーを修正する

NumPyは行列、配列、数学関数を含む数値計算における人気のツールです。NumPy配列のshape属性は、配列の次元を示すタプルを返します。また、NumPy配列の再形成や操作において、この属性は重要です。

以下はshape属性の機能の例です。

Python

 

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

出力:

Python

 

(2, 2)

shape属性は、pandasやOpenCVでも重要です。

以下はOpenCVでshape属性を使用する例です。

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オブジェクトはshape属性を持っていませんというエラーメッセージに遭遇することがあります。このエラーは、NumPyがNoneの値に割り当てられているか、まったく初期化されていない場合に発生します。それは配列が適切に定義されていないことを示し、それを操作に使用することはできません。

この記事では、PandasやNumPyなどのデータ処理ライブラリを使用して開発を完了するためのエラー解決のための実用的な解決策について学びます。

まずは解決策を要約し、その後詳細について説明します。参りましょう。

長すぎる?こちらにクイックソリューションがあります

  • 有効な値で配列を初期化するか、関数がNoneを返さないようにしてください。
  • 画像または動画のパスが正確であることを確認してください。誤ったパスはエラーを引き起こします。また、OpenCVがサポートしていないUnicode文字を含んでいないパスを提供してください。あるいは、画像または動画の場所を変更してください。
  • 画像/フレームをロードした後にアサートを追加することもできます。別の方法として、try/exceptを使用してエラーを処理することもできます。
  • 人工知能を使用して作成された画像を保存したが、画像を開こうとしたときにエラーが発生した場合は、dtype=np.uint8を追加する必要があります。これにより、人工知能を使用して作成された画像を保存できます。さらに、デバイス上のカメラが別のプログラムで開かれていないことを確認してください。もしそうであれば、プログラムを完全に閉じて、カメラを現在のプロジェクトに専用にしてください。
  • その他の場合、attributeerrorはOpenCVの古いバージョンから発生するため、このバージョンを更新してみてください。

1. パスのチェック

前述の通り、エラーの主な原因は誤ったパスを使用することです。そのため、os.path.exists()メソッドを使用して、パスがデバイス上に存在するかどうかを確認することが良いアイデアです。os.getcwd()関数は現在のディレクトリを表示し、パスを構築する際に重要です。

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’ ステートメントで確認する

エラーを修正するために、None 値がどこから来ているかを特定する必要があります。エラーが発生する一般的なケースを考えてみましょう。NumPy 配列を扱っているときに発生する場合です。NumPy 配列を扱っているとき、初期化されていない配列や None 値が割り当てられた配列を扱うとエラーが発生することがあります。

例えば:

Python

 

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

上記の出力は:

Python

 

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

特定のステートメントが返す変数の型を確認し、形状属性にアクセスする前にそれを判定することができます。if-else ステートメントはこのような場合に役立ちます。なぜなら、shape が値を返さない場合に None を返すことができるからです。

例を示します:

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 ブロックが実行されます。パスが存在しないため、variable is Nonetype object というエラーメッセージが表示されます。どんな種類のオペレーティングシステムを使用していても、パスを入力するだけで動作します。

4. 配列を有効な値で初期化する

NumPy を使用しているときにエラーに遭遇した場合の別の選択肢は、有効な値を使用することを確認することです。これは、ファイルや他のソースからデータを読み込むか、ゼロやワンのような NumPy 関数を使用することで実現できます。

ここで、コードを修正して配列をゼロで初期化します:

Python

 

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

出力:

Python

 

(3, 3)

結論

一方で、AttributeError: NoneTypeオブジェクトにはshape属性がないというエラーはプログラミングでよくあることですが、それを解決するためにいくつかの方法があります。重要なのは、オブジェクトのshape属性にアクセスしようとする前に、それがNoneであるかどうかを確認することです。もしそれがNoneであれば、Noneを返し、さもなければshapeに戻ります。

これでエラーを解決し、問題を解決し続けることができます。

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