NumPy היא כלי פופולרי לחישוב מספרים הכרוכים במטריצות, מערכים ופונקציות מתמטיות. תכונת הצורה של מערך NumPy מחזירה טווא שמציג את ממדי המערך. וכשמדובר בשינוי הצורה ובשיבוץ מערכי NumPy, התכונה היא קרדינלית.
להלן איך פונקציית תכונת shape
:
import numpy as np
arr = np.array([[5, 1], [16, 33]])
print(arr.shape)
פלט:
(2, 2)
תכונת הצורה חשובה גם ב-pandas או OpenCV.
הנה איך משתמשים בתכונת הצורה ב-OpenCV:
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). הפרטים המוצגים חשובים מכיוון שהם מאפשרים להציג את מבנה המערך ולכן מאפשרים לבצע פעולות עליו.
עם זאת, לפעמים תנסה לגשת לתכונת הצורה אך תסתיים בהודעת שגיאה AttributeError: NoneType
object has no attribute shape
. השגיאה מתרחשת כאשר NumPy שומר לערך None או שלא אותחל בכלל. כך מצביעה על כך שהמערך אינו מוגדר כראוי, ולכן אינך יכול להשתמש בו לביצוע פעולות.
במאמר זה, למדתם על פתרונות עבודה לפתרון השגיאה כך שתוכלו להשלים את הפיתוח באמצעות ספריות עיבוד נתונים כגון Pandas ו-NumPy.
ראשית מסבירים את הפתרונות בכלליות ולאחר מכן בפרטים. בואו נצלול.
ארוך מדי? הנה פתרון מהיר
- אתחל מערך עם ערכים תקפים, או ודא שפונקציות אינן מחזירות
None
. - הקלט את כיוון התמונה או הסרטון כדי לוודא שהוא מדויק מכיוון שכיוון לא נכון מעורר שגיאה. כמו כן, ספק כיוון שאינו מכיל תווים Unicode מאחר שOpenCV אינו תומך בכזה. כפול שינוי מיקום התמונה או הסרטון.
- הוסף אמור לאחר שאתה טוען את התמונה / מסגרת. ברצועה לשימוש בניסיון / להלן כדי לטפל בשגיאה.
- אם אתה משתמש בתמונות שנוצרו באמצעות יצירת מלאכה ושמרת אותם אך נתקלת בשגיאה כאשר ניסית לפתוח את התמונה, שמו לב שאתה צריך להוסיף
dtype=np.uint8
כך שתוכל לשמור תמונות שנוצרו באמצעות יצירת מלאכה. כמו כן, וודא כי המצלמה במכשיר שלך אינה פתוחה לתכנית אחרת. אם כן, סגור את התכנית לגמרי כך שהמצלמה מוקצה להישג הידיים. - במקרים אחרים,
attributeerror
מגיע מגרסאות מאוחרות יותר של OpenCV, אז נסה לעדכן את הגרסה.
1. בדוק כיוון
כפי שצוין קודם לכן, הסיבה העיקרית לשגיאה היא כאשר אתה משתמש בכיוון לא נכון. כך שזהו רעיון טוב לבדוק אם הכיוון קיים במכשיר או לא באמצעות פונקציה os.path.exists()
שיטה. הפונקציה os.getcws()
מדפיסה את הספרייה הנוכחית ולכן חיונית אם היית רוצה לבנות כיוון.
import os
print(os.path.exists('1.jpg'))
print(os.getcwd())
2. השתמש בניסיון / להלן
זה גם אפשרי לנהל את השגיאה באמצעות הצהרת try/except. הנה כיצד הפתרון עובד:
import cv2
img = cv2.imread('1.jpg')
try:
print(img.shape)
except AttributeError:
print('The ultimate value: ', img)
ראשית, הקטע try ירוץ, ואם נתקל בAttributeError
, אז הבלוק except מבוצע.
3. הפוך את המשתנה ל-'None' באמצעות ההצהרה 'אם אחרת'
כדי לתקן את השגיאה, עליך לזהות היכן מגיעה הערך None
. נבחן מקרה נפוץ שבו מתרחשת השגיאה; כאשר עובדים עם מערך NumPy. כשעובדים עם מערך NumPy
, יכולה להתרחש השגיאה כאשר עובדים עם מערך שלא הוקצה או אחד שהוקצה את הערך None
.
לדוגמה:
import numpy as np
arr = None
print(arr.shape)
הפלט לעיל הוא:
AttributeError: 'NoneType' object has no attribute 'shape'
אפשר לבדוק הצהרה נתונה ולקבוע את סוג המשתנה שהיא מחזירה לפני גישה לתכונת הצורה. במקרים כאלה, ההצהרה if-else
היא שימושית, שכן היא מאפשרת לך לדעת את shape
ומחזירה None
כשהshape
אינו מחזיר ערך.
הנה דוגמה:
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
, והאזור האחר מבוצע כשערך המשתנה הוא 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