ברוכים הבאים ליחידה "מבוא לניתוח נתונים עם NumPy"! יחידה זו תציג בפניכם את ספריית NumPy, אבן יסוד אדירה בעולם מדעי הנתונים ב-Python. נלמד כיצד NumPy מאפשרת לבצע חישובים נומריים מורכבים ויעילים על מערכים רב-ממדיים, תוך התגברות על מגבלות הביצועים של רשימות Python רגילות. הבנה מעמיקה של מושגים כמו מערכי ndarray, פעולות וקטוריות ו-Broadcasting חיונית לכל מי שעוסק בניתוח נתונים, למידת מכונה וחישוב מדעי.
יסודות NumPy: מערכי ndarray
הליבה של NumPy היא אובייקט ה-ndarray (N-dimensional array), מבנה נתונים עוצמתי המאפשר אחסון ועיבוד יעיל של נתונים מספריים. בניגוד לרשימות Python, מערכי NumPy הם הומוגניים (כלומר, מכילים נתונים מאותו סוג), בעלי גודל קבוע לאחר יצירתם, וממומשים בשפת C, מה שמקנה להם יתרון משמעותי בביצועים ובצריכת זיכרון.
יצירת מערכים
- מתוך רשימות 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 ומספקות ביצועים אופטימליים.
np.sin(), np.exp(), np.sqrt(). הן ממומשות ביעילות רבה בשפות נמוכות יותר.פונקציות צבירה (Aggregation Functions)
NumPy מספקת פונקציות מובנות לחישוב סטטיסטיקות על מערכים, כגון .sum(), .mean(), .std(), .min(), .max(). ניתן לבצע צבירה על פני מימדים ספציפיים באמצעות הפרמטר axis.
רשימות Python
גמישות בסוגי נתונים, גודל דינמי. פעולות מתמטיות דורשות לולאות מפורשות (איטיות לנתונים גדולים). צריכת זיכרון גבוהה יותר לנתונים מספריים.
מערכי NumPy
הומוגניים, גודל קבוע. פעולות מתמטיות וקטוריות (מהירות ויעילות). צריכת זיכרון נמוכה יותר וביצועים מעולים לחישובים נומריים.
Broadcasting: הרחבת פעולות על מערכים
Broadcasting הוא מנגנון עוצמתי ב-NumPy המאפשר לבצע פעולות על מערכים בעלי צורות (shapes) שונות, ללא צורך לשכפל נתונים באופן מפורש. הכללים פשוטים: NumPy מנסה להתאים את המימדים של המערכים על ידי "מתיחת" מימדים בגודל 1 או הוספת מימדים חדשים. אם המימדים תואמים או ניתנים להתאמה, הפעולה מתבצעת.
כללי Broadcasting
- אם למערכים אין אותו מספר מימדים, המערך עם פחות מימדים מקבל מימדים חדשים בגודל 1 בצד שמאל.
- עבור כל מימד, אם הגדלים אינם זהים, אחד מהם חייב להיות 1. המימד עם גודל 1 נמתח כך שיתאים למימד השני.
- אם אף אחד מהתנאים לעיל לא מתקיים, Broadcasting נכשל ומועלה שגיאה.
פעולות וקטוריות: הליבה של יעילות NumPy
פעולות וקטוריות הן הדרך העיקרית לביצוע חישובים מהירים ב-NumPy. במקום לכתוב לולאות Python איטיות שעוברות על כל אלמנט בנפרד, אנו מבצעים פעולות על מערכים שלמים. NumPy מממשת פעולות אלו באמצעות קוד C או Fortran אופטימלי, המנצל את ארכיטקטורת המעבד (SIMD - Single Instruction, Multiple Data) ומבצע חישובים במקביל.
היתרונות של פעולות וקטוריות הם עצומים: הן מהירות יותר, קצרות יותר לכתיבה, ופחות נוטות לשגיאות בהשוואה ללולאות מפורשות. הן משלבות את העוצמה של 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מבצע פעולה לאורך השורות (מצמצם את מימד העמודות).