NumPy 是一個廣受歡迎的工具,用於計算涉及矩陣、陣列和數學函數的數值。NumPy 陣列的 shape 屬性返回一個元組,顯示陣列的維度。在重塑和操作 NumPy 陣列時,此屬性至關重要。
以下是 shape
屬性功能的示例:
import numpy as np
arr = np.array([[5, 1], [16, 33]])
print(arr.shape)
輸出:
(2, 2)
shape 屬性在 pandas 或 OpenCV 中也同樣重要。
以下是如何在 OpenCV 中使用 shape 屬性的示例:
import cv2
img = cv2.imread(r'C:\Users\ADMIN.DESKTOP-KB78BPH\Desktop\New folder
(2)\2.jpg')
print(img.shape)
輸出結果為:
(1280, 1920, 3)
如觀察所示,程序執行後返回形狀為 (1280, 1920, 3)。提供的細節非常重要,因為它展示了陣列的結構,從而使得對其進行操作成為可能。
然而,有時您可能嘗試訪問 shape 屬性,卻收到錯誤消息 AttributeError: NoneType
物件沒有屬性 shape
。此錯誤發生在 NumPy 被 賦予 None 值或根本未初始化時。這表明陣列未正確定義,因此無法用於執行操作。
在本文中,您將了解解決此錯誤的工作方案,以便您可以使用 Pandas 和 NumPy 等數據處理庫完成開發。
我們首先概述解決方案,然後再詳細說明。讓我們開始吧。
太長不看?這裡有快速解決方案
- 初始化一個具有有效值的陣列,或確保函數不返回
None
。 - 確認圖像或視頻路徑是否正確,因為錯誤的路徑會導致錯誤提示。同時,提供一個不包含Unicode字符的路徑,因為OpenCV不支持此類字符。或者,更改圖像或視頻的位置。
- 在加載圖像/幀後添加斷言。另一個選擇是使用try/except來處理錯誤。
- 如果你使用人工智能生成的圖像並保存了它們,但在嘗試打開圖像時遇到了錯誤,請注意你需要添加
dtype=np.uint8
,以便你可以保存使用人工智能創建的圖像。此外,確保你的設備上的攝像頭未被另一個程序打開。如果是這樣,請完全關閉該程序,以便攝像頭專注於當前項目。 - 在其他情況下,
attributeerror
可能是由於OpenCV的過時版本,因此嘗試更新此版本。
1. 檢查路徑
如前所述,錯誤的主要原因是使用了錯誤的路徑。因此,使用os.path.exists()
方法檢查路徑是否存在於設備上是個好主意。然後,os.getcwd()
函數打印當前目錄,如果你希望構建路徑,這是非常重要的。
import os
print(os.path.exists('1.jpg'))
print(os.getcwd())
2. 使用Try/Except
也可以使用try/except語句來管理錯誤。以下是解決方案的工作原理:
import cv2
img = cv2.imread('1.jpg')
try:
print(img.shape)
except AttributeError:
print('The ultimate value: ', img)
首先,try段將運行,如果遇到AttributeError
,則執行except塊。
3. 使用 ‘If Else’ 语句检查变量是否为 ‘None’
为了解决这个错误,你需要确定None
值的来源。让我们考虑一个常见的错误发生情况:在处理NumPy数组时。在处理NumPy
数组时,当你处理一个未初始化的数组或已被赋值为None
的数组时,可能会遇到这个错误。
例如:
import numpy as np
arr = None
print(arr.shape)
上述代码的输出为:
AttributeError: 'NoneType' object has no attribute 'shape'
你可以检查给定的语句,并确定它返回的变量类型,然后再访问形状属性。使用if-else
语句在这种情况下非常有用,因为它可以让你知道shape
,并在shape
没有返回值时返回None
。
这里有一个例子:
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')
输出:
variable is Nonetype object
在上面的例子中,我们首先指定了绝对路径。if
块仅在变量存储了非None
的有效值时执行,而else块则在变量值为None时执行。我们得到的错误信息variable is Nonetype object
是因为路径不存在。这些步骤适用于任何操作系统,你只需输入路径即可。
4. 初始化数组为有效值
当你在使用NumPy
时遇到错误时的另一个选项是确保你使用的是有效值。这可以通过从文件或其他来源读取数据或使用NumPy
函数如zeros和ones来实现。
在此,我們修改程式碼以將陣列初始化為零:
import numpy as np
arr = np.zeros((3, 3))
print(arr.shape)
輸出:
(3, 3)
結論
雖然AttributeError: NoneType
物件沒有屬性shape
在程式設計中很常見,但有幾種方法可以選擇並解決它。重要的是,在嘗試存取物件的形狀屬性之前,要檢查該物件是否為None
。如果是None
,則返回None
;否則,返回shape
。
現在,您可以解決此錯誤並繼續解決問題。
Source:
https://dzone.com/articles/fix-attributeerror-nonetype-object-has-no-attribut