מדריך למערכים ב-Python

מדריך למערכים ב-Python

מבוא

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

מערכים עומדים כאחד ממבני הנתונים הבסיסיים והנפוצים ביותר.

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

במדריך זה, אנו נותנים לך סקירה מקיפה של מבנה הנתונים של המערך. קודם כל, נסקור מהם מערכים ומהם המאפיינים העיקריים שלהם. לאחר מכן נעבור לעולם של Python, ונחקור כיצד מערכים מיושמים, מתפעלים ומיושמים בתרחישים בעולם האמיתי.

הבנת מבנה הנתונים של המערך

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

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

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

לדוגמה, שקול מערך של מספרים שלמים: [10, 20, 30, 40, 50]. הנה, האלמנט 20 יש מדד של 1:

אינדקס מערך python

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

הערות: מערכים שימושיים במיוחד בתרחישים שבהם ה גודל האוסף ידוע מראש ונשאר קבוע, או כאשר גישה אקראית היא תכופה יותר מהוספות ומחיקות.

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

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

  • נמצא באינדקס: בדיוק כמו שלכל שיר ברשימת ההשמעה שלך יש מספר (1, 2, 3, …), לכל אלמנט במערך יש אינדקס. אבל, ברוב שפות התכנות, האינדקס מתחיל ב-0. לכן, הפריט הראשון נמצא באינדקס 0, השני באינדקס 1, וכן הלאה.

  • בעל גודל קבוע: כאשר אתה יוצר רשימת השמעה עבור, נניח, 10 שירים, אתה לא יכול להוסיף שיר 11 מבלי להסיר אחד קודם. באופן דומה, למערכים יש גודל קבוע. ברגע שאתה יוצר מערך בגודל מסוים, לא תוכל להוסיף יותר פריטים מהקיבולת שלו.

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

  • בעל גישה ישירה: אם אתה רוצה להאזין לשיר השביעי ברשימת ההשמעה שלך, אתה יכול לקפוץ ישירות אליו. באופן דומה, עם מערכים, אתה יכול לגשת באופן מיידי לכל אלמנט אם אתה יודע את האינדקס שלו.

  • זיכרון רציף: זה קצת יותר טכני. כאשר מערך נוצר בזיכרון של מחשב, הוא תופס בלוק זיכרון רציף. תחשוב על זה כמו שורה של לוקרים צמודים בבית הספר. כל ארון נמצא ליד השני, ללא פערים ביניהם.

פייתון ומערכים

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

במבט הראשון, הרשימה של פייתון אולי נראה שם נרדף למערך, אבל יש הבדלים וניואנסים עדינים שיש לקחת בחשבון:

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

כשמסתכלים על הטבלה הזו, זה טבעי לשאול - "מתי להשתמש באיזה?". ובכן, אם אתה צריך אוסף שיכול לגדול או להתכווץ באופן דינמי ויכול להחזיק סוגי נתונים מעורבים, הרשימה של Python היא הדרך ללכת. עם זאת, עבור תרחישים הדורשים אוסף יעיל יותר בזיכרון עם אלמנטים מאותו סוג, כדאי לשקול להשתמש ב-Python's array מודול או ספריות חיצוניות כמו NumPy.

השמיים מערך מודול בפייתון

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

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

יצירת מערך

לשימוש ב- array מודול, תחילה עליך לייבא אותו:

from array import array

לאחר הייבוא, תוכל ליצור מערך באמצעות ה array() בַּנַאִי:

arr = array('i', [1, 2, 3, 4, 5])
print(arr)

הנה ה 'i' ארגומנט מציין שהמערך יאחסן חתומים מספרים שלמים. ישנם מספר קודי סוגים אחרים זמינים, כגון 'f' עבור מצופים ו 'd' לזוגות.

גישה ושינוי אלמנטים

אתה יכול לגשת ולשנות אלמנטים במערך בדיוק כפי שהיית עושה עם רשימה:

print(arr[2]) 

ועכשיו, בואו נשנה את האלמנט על ידי שינוי הערך שלו ל 6:

arr[2] = 6
print(arr) 

שיטות מערך

השמיים array מודול מספק מספר שיטות לתפעול מערכים:

  • append() – מוסיף אלמנט לסוף המערך:

    arr.append(7)
    print(arr) 
  • extend() - מוסיף אלמנטים שניתנים לחזרה לסוף:

    arr.extend([8, 9])
    print(arr) 
  • pop() - מסיר ומחזיר את האלמנט במיקום הנתון:

    arr.pop(2)
    print(arr) 
  • remove(): מסיר את המופע הראשון של הערך שצוין:

    arr.remove(2)
    print(arr) 
  • reverse(): הופך את הסדר של המערך:

    arr.reverse()
    print(arr) 

הערה: יש יותר שיטות ממה שציינו כאן. עיין ב תיעוד רשמי של Python כדי לראות רשימה של כל השיטות הזמינות ב- array מודול.

בעוד array מודול מציע דרך יעילה יותר בזיכרון לאחסון סוגי נתונים בסיסיים, חיוני לזכור זאת מגבלות. בניגוד לרשימות, מערכים כן הוֹמוֹגֵנִי. המשמעות היא שכל הרכיבים במערך חייבים להיות מאותו סוג. כמו כן, אתה יכול רק לאחסן סוגי נתונים בסיסיים בסגנון C במערכים. אם אתה צריך לאחסן אובייקטים מותאמים אישית או סוגי Python אחרים, תצטרך להשתמש ברשימה או במבנה נתונים אחר.

מערכי NumPy

NumPy, קיצור של Numerical Python, היא חבילת יסוד לחישובים נומריים ב-Python. אחד המאפיינים העיקריים שלו הוא העוצמה שלו אובייקט מערך N-ממדי, המציע פעולות מהירות על מערכים, כולל מתמטי, לוגי, מניפולציה של צורות ועוד.

מערכי NumPy מגוונים יותר מהמערך המובנה של Python array מודול ומהווים מרכיב עיקרי בפרויקטים של מדעי נתונים ולמידת מכונה.

למה להשתמש במערכים NumPy?

הדבר הראשון שעולה בראש הוא ביצועים. מערכי NumPy מיושמים ב-C ומאפשרים אחסון זיכרון יעיל ופעולות מהירות יותר בזכות אלגוריתמים אופטימליים והיתרונות של אחסון זיכרון רציף.

בעוד שהרשימות והמערכים המובנים של Python הם חד מימדיים, מערכי NumPy יכולים להיות רַב מֵמָדִים, מה שהופך אותם לאידיאליים לייצוג מטריצות או טנסורים.

עיין במדריך המעשי והמעשי שלנו ללימוד Git, עם שיטות עבודה מומלצות, סטנדרטים מקובלים בתעשייה ודף רמאות כלול. תפסיק לגוגל פקודות Git ולמעשה ללמוד זה!

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

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

יצירת מערך NumPy

כדי להשתמש ב-NumPy, תחילה עליך להתקין אותו (pip install numpy) ולאחר מכן ייבא אותו:

import numpy as np

לאחר הייבוא, תוכל ליצור מערך NumPy באמצעות ה array() פוּנקצִיָה:

arr = np.array([1, 2, 3, 4, 5])
print(arr) 

ניתן גם ליצור מערכים רב מימדיים:

matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(matrix)

זה ייתן לנו:

[[1 2 3] [4 5 6] [7 8 9]]

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

arr = np.arange(10)
print(arr) 

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

even_space = np.linspace(0, 1, 5)
print(even_space) 

גישה ושינוי אלמנטים

גישה ושינוי של אלמנטים במערך NumPy הם אינטואיטיביים:

print(arr[2]) arr[2] = 6
print(arr) 

עושה כמעט אותו דבר עבור מערכים רב מימדיים:

print(matrix[1, 2]) matrix[1, 2] = 10
print(matrix)

ישנה את הערך של האלמנט בשורה השנייה (אינדקס 1) והעמודה השלישית (אינדקס 2):

[[1 2 3] [4 5 20] [7 8 9]]

שינוי הצורה של מערך

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

import numpy as np arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
print("Original Array:")
print(arr) 

ואנחנו רוצים לעצב אותו מחדש למטריצה ​​3×4. כל מה שאתה צריך לעשות הוא להשתמש ב- reshape() שיטה עם מימדים רצויים שהועברו כארגומנטים:


reshaped_arr = arr.reshape(3, 4)
print("Reshaped Array (3x4):")
print(reshaped_arr)

זה יביא ל:

Reshaped Array (3x4):
[[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12]]

כפל מטריקס

השמיים numpy.dot() שיטה משמשת עבור כפל מטריצה. הוא מחזיר את מכפלת הנקודות של שני מערכים. עבור מערכים חד מימדיים, זה ה מוצר פנימי של המערכים. עבור מערכים דו מימדיים, זה שווה ערך ל כפל מטריצה, ועבור ND, זה א מוצר סכום מעל הציר האחרון של המערך הראשון והשני-אחרון של המערך השני.

בואו נראה איך זה עובד. ראשית, בואו נחשב את מכפלת הנקודות של שני מערכים 1-D (המכפלה הפנימית של הוקטורים):

import numpy as np vec1 = np.array([1, 2, 3])
vec2 = np.array([4, 5, 6])
dot_product_1d = np.dot(vec1, vec2) print("Dot product of two 1-D arrays:")
print(dot_product_1d) 

זה יביא ל:

Dot product of two 1-D arrays:
32

32 הוא, למעשה, המכפלה הפנימית של שני המערכים - (14 + 25 + 3*6). לאחר מכן, נוכל לבצע כפל מטריצה ​​של שני מערכים דו-ממדיים:


mat1 = np.array([[1, 2], [3, 4]])
mat2 = np.array([[2, 0], [1, 3]])
matrix_product = np.dot(mat1, mat2) print("Matrix multiplication of two 2-D arrays:")
print(matrix_product) 

מה שייתן לנו:

Matrix multiplication of two 2-D arrays:
[[ 4 6] [10 12]]

מערכי NumPy הם עלייה משמעותית מהרשימות המובנות של Python וה- array מודול, במיוחד עבור חישובים מדעיים ומתמטיים. היעילות שלהם, בשילוב עם הפונקציונליות העשירה שמספקת ספריית NumPy, הופכת אותם לכלי הכרחי לכל מי שמחפש לבצע פעולות מספריות ב- Python.

סיכום

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

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

בול זמן:

עוד מ Stackabuse