Smart-World Surf

יחידה 7: מבוא לניתוח נתונים עם NumPy

חישובים נומריים יעילים עם מערכים רב-ממדיים.
מערכי NumPy (ndarrays)פעולות על מערכיםBroadcastingפעולות וקטוריות

ברוכים הבאים ליחידה "מבוא לניתוח נתונים עם NumPy"! יחידה זו תציג בפניכם את ספריית NumPy, אבן יסוד אדירה בעולם מדעי הנתונים ב-Python. נלמד כיצד NumPy מאפשרת לבצע חישובים נומריים מורכבים ויעילים על מערכים רב-ממדיים, תוך התגברות על מגבלות הביצועים של רשימות Python רגילות. הבנה מעמיקה של מושגים כמו מערכי ndarray, פעולות וקטוריות ו-Broadcasting חיונית לכל מי שעוסק בניתוח נתונים, למידת מכונה וחישוב מדעי.

יסודות NumPy: מערכי ndarray

הליבה של NumPy היא אובייקט ה-ndarray (N-dimensional array), מבנה נתונים עוצמתי המאפשר אחסון ועיבוד יעיל של נתונים מספריים. בניגוד לרשימות Python, מערכי NumPy הם הומוגניים (כלומר, מכילים נתונים מאותו סוג), בעלי גודל קבוע לאחר יצירתם, וממומשים בשפת C, מה שמקנה להם יתרון משמעותי בביצועים ובצריכת זיכרון.

ndarray (N-dimensional array): מבנה נתונים מרכזי ב-NumPy המייצג מערך רב-ממדי של פריטים מאותו סוג נתונים (לדוגמה, מספרים שלמים או נקודה צפה). מאפשר פעולות מתמטיות מהירות ויעילות על כלל המערך.

יצירת מערכים

  • מתוך רשימות Python: np.array([1, 2, 3])
  • מערכים מאותחלים: np.zeros((2, 3)), np.ones((4,)), np.empty((2, 2))
  • טווחים: np.arange(0, 10, 2), np.linspace(0, 1, 5)

תכונות חשובות של מערכים

  • .shape: טופל המייצג את מימדי המערך (לדוגמה, (3, 4) למערך 3x4).
  • .ndim: מספר המימדים של המערך.
  • .dtype: סוג הנתונים של אלמנטים במערך (לדוגמה, int64, float32).
  • .size: המספר הכולל של אלמנטים במערך.

אינדוקס וחיתוך (Indexing and Slicing)

גישה לאלמנטים או תתי-מערכים מתבצעת באופן דומה לרשימות Python, אך עם הרחבה למימדים מרובים. ניתן להשתמש באינדקסים שלמים, טווחים (slices) ואף מערכים בוליאניים או מערכי אינדקסים.

פעולות יסודיות ופונקציות אוניברסליות (ufuncs)

NumPy מצטיינת בביצוע פעולות מתמטיות על מערכים שלמים ביעילות מרבית, ללא צורך בלולאות מפורשות ב-Python. פעולות אלו נקראות פעולות וקטוריות.

פעולות אלמנט-לפי-אלמנט

פעולות אריתמטיות (חיבור, חיסור, כפל, חילוק), לוגיות והשוואתיות מבוצעות באופן אוטומטי על כל אלמנט במערך. לדוגמה, arr + 5 יוסיף 5 לכל אלמנט ב-arr.

פונקציות אוניברסליות (Universal Functions - ufuncs)

פונקציות אלו הן פונקציות מהירות המבצעות פעולות אלמנט-לפי-אלמנט על מערכי NumPy. הן ממומשות ב-C ומספקות ביצועים אופטימליים.

ufunc (Universal Function): פונקציה ב-NumPy המבצעת פעולה אלמנט-לפי-אלמנט על מערכי ndarray. דוגמאות כוללות np.sin(), np.exp(), np.sqrt(). הן ממומשות ביעילות רבה בשפות נמוכות יותר.

פונקציות צבירה (Aggregation Functions)

NumPy מספקת פונקציות מובנות לחישוב סטטיסטיקות על מערכים, כגון .sum(), .mean(), .std(), .min(), .max(). ניתן לבצע צבירה על פני מימדים ספציפיים באמצעות הפרמטר axis.

רשימות Python

גמישות בסוגי נתונים, גודל דינמי. פעולות מתמטיות דורשות לולאות מפורשות (איטיות לנתונים גדולים). צריכת זיכרון גבוהה יותר לנתונים מספריים.

מערכי NumPy

הומוגניים, גודל קבוע. פעולות מתמטיות וקטוריות (מהירות ויעילות). צריכת זיכרון נמוכה יותר וביצועים מעולים לחישובים נומריים.

Broadcasting: הרחבת פעולות על מערכים

Broadcasting הוא מנגנון עוצמתי ב-NumPy המאפשר לבצע פעולות על מערכים בעלי צורות (shapes) שונות, ללא צורך לשכפל נתונים באופן מפורש. הכללים פשוטים: NumPy מנסה להתאים את המימדים של המערכים על ידי "מתיחת" מימדים בגודל 1 או הוספת מימדים חדשים. אם המימדים תואמים או ניתנים להתאמה, הפעולה מתבצעת.

Broadcasting: סט כללים ב-NumPy המאפשר לבצע פעולות אריתמטיות על מערכים בעלי צורות שונות. NumPy "מותחת" באופן וירטואלי את המערך הקטן יותר כך שיתאים לצורת המערך הגדול יותר, מבלי לשכפל נתונים פיזית.
Broadcasting: זהו נושא קריטי לבחינה! הבנה מעמיקה של כללי ה-Broadcasting חיונית לכתיבת קוד NumPy יעיל, קריא ונכון. טעויות נפוצות נובעות מאי-הבנה כיצד מימדים נמתחים או מתי Broadcasting נכשל. שליטה בו מאפשרת להימנע מלולאות מפורשות ולנצל את מלוא כוחה של NumPy.

כללי Broadcasting

  1. אם למערכים אין אותו מספר מימדים, המערך עם פחות מימדים מקבל מימדים חדשים בגודל 1 בצד שמאל.
  2. עבור כל מימד, אם הגדלים אינם זהים, אחד מהם חייב להיות 1. המימד עם גודל 1 נמתח כך שיתאים למימד השני.
  3. אם אף אחד מהתנאים לעיל לא מתקיים, Broadcasting נכשל ומועלה שגיאה.

פעולות וקטוריות: הליבה של יעילות NumPy

פעולות וקטוריות הן הדרך העיקרית לביצוע חישובים מהירים ב-NumPy. במקום לכתוב לולאות Python איטיות שעוברות על כל אלמנט בנפרד, אנו מבצעים פעולות על מערכים שלמים. NumPy מממשת פעולות אלו באמצעות קוד C או Fortran אופטימלי, המנצל את ארכיטקטורת המעבד (SIMD - Single Instruction, Multiple Data) ומבצע חישובים במקביל.

וקטוריזציה (Vectorization): עקרון תכנות ב-NumPy המאפשר לבצע פעולות על מערכים שלמים (או חלקים מהם) במקום על אלמנטים בודדים באמצעות לולאות Python. מוביל לשיפור דרמטי בביצועים ובקריאות הקוד.

היתרונות של פעולות וקטוריות הם עצומים: הן מהירות יותר, קצרות יותר לכתיבה, ופחות נוטות לשגיאות בהשוואה ללולאות מפורשות. הן משלבות את העוצמה של ufuncs ואת הגמישות של Broadcasting כדי לספק פתרונות אלגנטיים ויעילים לבעיות חישוביות.

שאלות לדיון

  • הסבירו מדוע מערכי NumPy עדיפים על רשימות Python לביצוע חישובים נומריים בקנה מידה גדול. התייחסו ללפחות שני יתרונות מרכזיים.
  • תארו את כללי ה-Broadcasting ב-NumPy והדגימו כיצד הם מאפשרים לבצע פעולות בין מערך דו-ממדי למערך חד-ממדי.
  • מהי פונקציה אוניברסלית (ufunc) ב-NumPy? תנו דוגמה לשתי ufuncs שונות והסבירו את תפקידן.
  • כיצד הפרמטר axis משפיע על פונקציות צבירה כמו np.sum() או np.mean()? תנו דוגמה למערך דו-ממדי והסבירו את ההבדל בין axis=0 ל-axis=1.

נקודות לתשובת מודל

  • יתרונות NumPy: הומוגניות נתונים, מימוש ב-C/Fortran, פעולות וקטוריות, צריכת זיכרון נמוכה יותר, מהירות ביצוע.
  • כללי Broadcasting: התאמת מימדים מימין לשמאל; מימדים בגודל 1 נמתחים; הוספת מימדים בגודל 1 בצד שמאל למערך הקטן יותר. דוגמה: חיבור מטריצה (M, N) לוקטור (N,) או (M, 1).
  • ufuncs: פונקציות מהירות המבצעות פעולות אלמנט-לפי-אלמנט. דוגמאות: np.sin(), np.log(), np.add(). הן ממומשות ב-C לביצועים אופטימליים.
  • פרמטר axis: קובע לאורך איזה מימד תתבצע הפעולה. axis=0 מבצע פעולה לאורך העמודות (מצמצם את מימד השורות), axis=1 מבצע פעולה לאורך השורות (מצמצם את מימד העמודות).
מצאתם טעות או שחסר משהו?
→ הקודמת
יסודות תכנות מונחה עצמים (OOP)
הבאה ←
מניפולציית נתונים עם Pandas