Menu
CoddyTech

NumPy Cheat Sheet: דף עזר ל-NumPy

עודכן לאחרונה

יצירת מערכים

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

משימהקוד
ייבוא NumPyimport numpy as np
מרשימהnp.array([1, 2, 3])
מערך דו-ממדי מרשימות מקוננותnp.array([[1, 2, 3], [4, 5, 6]])
אפסים, אחדות, ערך מילוי אחדnp.zeros((2, 3)), np.ones(4), np.full((2, 2), 7)
טווח עם צעד (בלי הקצה)np.arange(0, 10, 2) # [0 2 4 6 8]
n נקודות במרווחים שווים (כולל הקצה)np.linspace(0, 1, 5) # [0. 0.25 0.5 0.75 1.]
מטריצת יחידהnp.eye(3)
באותו shape כמו מערך אחרnp.zeros_like(m), np.ones_like(m)
בחירת סוג האיבריםnp.array([1, 2, 3], dtype=np.float32)
רשתות קואורדינטותxx, yy = np.meshgrid(np.arange(3), np.arange(2))

בדיקת מערך

משימהקוד
Shape: הגודל של כל ממדm.shape # (3, 4)
מספר הממדיםm.ndim # 2
מספר האיבריםm.size # 12
סוג האיבריםm.dtype # int64
המרת הסוגm.astype(np.float64)
האורך של הממד הראשוןlen(m) # 3
חזרה לרשימה של Pythonm.tolist()
הדפסה עם פחות ספרות אחרי הנקודהnp.set_printoptions(precision=3, suppress=True)

אינדקסים ו-slicing

Slices הם views: הם חולקים זיכרון עם המערך המקורי. מסכות ורשימות אינדקסים מחזירות עותקים.

משימהקוד
האיבר הראשון והאחרוןa[0], a[-1]
Slice start:stop (בלי stop)a[1:4] # [20 30 40]
כל איבר שני, בסדר הפוךa[::2], a[::-1]
איבר אחד במערך דו-ממדיm[1, 2] # 6
שורה, עמודהm[0], m[:, 1]
בלוק של שורות ועמודותm[:2, 1:3]
איברים שעומדים בתנאיa[a > 25] # [30 40 50]
שילוב תנאיםa[(a > 15) & (a < 45)]
בחירה לפי רשימת מיקומיםa[[0, 2, 4]]
מיקומים שעומדים בתנאיnp.flatnonzero(a > 25) # [2 3 4]
בחירה לכל איברnp.where(a > 25, a, 0)
העתקה לפני שינוי slicepart = a[1:3].copy()
השמת ערכים עם מסכהa[a > 40] = 0

מתמטיקה ו-broadcasting

האופרטורים עובדים איבר-איבר. Broadcasting מותח סקלר, שורה או עמודה כדי שיתאימו ל-shape של המערך השני.

משימהקוד
אריתמטיקה איבר-איברx + y, x - y, x * y, x / y, x ** 2
עם סקלרx * 10
שורש ריבועי, חזקה, לוגריתםnp.sqrt(x), np.exp(x), np.log(x)
ערך מוחלט, עיגולnp.abs(x - 5), np.round(x / 3, 2)
הגבלת ערכים לטווחnp.clip(x, 2, 8)
מקסימום איבר-איברnp.maximum(x, 3)
מכפלה סקלריתx @ y # 37.0
מירכוז כל עמודה (broadcasting של שורה)m - m.mean(axis=0)
שינוי סקאלה לכל שורה (broadcasting של עמודה)m / m.sum(axis=1, keepdims=True)
השוואה בטוחה של floatsnp.isclose(0.1 + 0.2, 0.3) # True, np.allclose(x, y)
טריגונומטריה ו-pinp.sin(np.pi / 2) # 1.0

אגרגציה לאורך axis

axis=0 עובד לאורך השורות ונותן תוצאה אחת לכל עמודה. axis=1 עובד לרוחב העמודות ונותן תוצאה אחת לכל שורה.

משימהקוד
סכום כל האיבריםm.sum() # 21
תוצאה אחת לכל עמודהm.sum(axis=0) # [5 7 9]
תוצאה אחת לכל שורהm.sum(axis=1) # [ 6 15]
ממוצע וסטיית תקןm.mean(), m.std(), m.mean(axis=0)
מינימום, מקסימוםm.min(), m.max(axis=1)
המיקום של המקסימוםm.argmax(), m.argmax(axis=1)
חציון ואחוזוניםnp.median(m), np.percentile(m, [25, 50, 75])
סכום מצטברnp.cumsum(m, axis=1)
מכפלת כל האיבריםm.prod() # 720
Any, all, ספירה(m > 4).any(), (m > 0).all(), np.count_nonzero(m > 2)

Reshape ושילוב

Reshape שומר על האיברים ומשנה את ה-shape, ולכן הגודל הכולל חייב להישאר זהה.

משימהקוד
Shape חדשa.reshape(2, 3)
לתת ל-NumPy לחשב גודל אחדa.reshape(3, -1), a.reshape(-1, 1)
שיטוח למערך חד-ממדיm.ravel(), m.flatten()
שחלוף (transpose)m.T
הוספת ממדa[:, np.newaxis], np.expand_dims(a, axis=0)
הסרת ממדים בגודל 1np.squeeze(np.ones((1, 3, 1)))
חיבור לאורך axis קייםnp.concatenate([a, a])
הערמת שורות או עמודותnp.vstack([m, m]), np.hstack([m, m])
מערכים חד-ממדיים כעמודותnp.column_stack([a, a ** 2])
הערמה לאורך axis חדשnp.stack([a, a], axis=0) # shape (2, 6)
פיצול לחלקיםnp.split(a, 3), np.array_split(a, 4)
חזרה או ריצוףnp.repeat([1, 2], 2) # [1 1 2 2], np.tile([1, 2], 2) # [1 2 1 2]

מיון, חיפוש וערכים ייחודיים

משימהקוד
עותק ממויןnp.sort(a)
הגדול ביותר קודםnp.sort(a)[::-1]
המיקומים שימיינו את המערךnp.argsort(a)
שלושת הערכים הגדוליםnp.sort(a)[-3:]
ערכים ייחודיים והספירות שלהםvalues, counts = np.unique(a, return_counts=True)
השמות של NumPy 2 (unique_values עשוי להחזיר לא ממוין)np.unique_values(a), np.unique_counts(a)
האם כל איבר נמצא ברשימה?np.isin(a, [1, 9])
מיקום הכנסה במערך ממויןnp.searchsorted([1, 3, 5, 7], 4) # 2
פעולות על קבוצותnp.intersect1d(a, [1, 2, 10]), np.union1d(a, [10]), np.setdiff1d(a, [1])
מיון שורות לפי עמודה אחתm[m[:, 1].argsort()]

מספרים אקראיים

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

משימהקוד
Generator עם seedrng = np.random.default_rng(42)
Floats בטווח [0, 1)rng.random(3)
מספרים שלמים, בלי הקצה העליוןrng.integers(1, 7, size=10)
התפלגות נורמליתrng.normal(loc=0, scale=1, size=(2, 3))
Floats אחידים בטווחrng.uniform(5, 10, size=4)
בחירה מרשימהrng.choice(["a", "b", "c"], size=5)
בחירה בלי חזרותrng.choice(10, size=3, replace=False)
בחירה עם משקליםrng.choice(["H", "T"], size=10, p=[0.7, 0.3])
עותק מעורבב, ערבוב במקוםrng.permutation(a), rng.shuffle(a)
ספירות בינומיות ופואסוןrng.binomial(10, 0.5, size=5), rng.poisson(3, size=5)

אלגברה לינארית

משימהקוד
כפל מטריצותA @ A
פתרון Ax = bnp.linalg.solve(A, b) # [0.8 1.4]
מטריצה הפוכה ודטרמיננטהnp.linalg.inv(A), np.linalg.det(A)
אורך וקטורnp.linalg.norm(b)
ערכים עצמיים ווקטורים עצמייםvalues, vectors = np.linalg.eig(A)
התאמת קו ישרslope, intercept = np.polyfit(x, y, 1)
מכפלה חיצוניתnp.outer([1, 2], [3, 4])
אלכסון ועקבהnp.diag(A), np.trace(A)

ערכים חסרים ומיוחדים

np.nan מסמן float חסר. כל חישוב איתו נותן nan, אז השתמשו בפונקציות ה-nan או במסכה.

משימהקוד
ערך חסרnp.nan
מציאת ערכים חסריםnp.isnan(v), np.isnan(v).sum()
הסרת ערכים חסריםv[~np.isnan(v)]
החלפת ערכים חסרים ואינסופייםnp.nan_to_num(v, nan=0.0, posinf=0.0)
בדיקות אינסוף וסופיותnp.inf, np.isfinite(v)
סטטיסטיקות שמדלגות על NaNnp.nanmean(v[:3]) # 2.0, np.nanmax(v)

שמירה וטעינה

משימהקוד
מערך אחד, קובץ בינאריnp.save("data.npy", m), m = np.load("data.npy")
כמה מערכים בקובץ אחדnp.savez("data.npz", x=x, y=y), np.load("data.npz")["x"]
כתיבת CSV כטקסטnp.savetxt("data.csv", m, delimiter=",", fmt="%d")
קריאת CSV כטקסטnp.loadtxt("data.csv", delimiter=",")

NumPy 2: שמות ישנים ומה לכתוב היום

NumPy 2 הסיר הרבה כינויים, ולכן קוד שהועתק ממדריכים ישנים עלול להיכשל עם AttributeError.

משימהNumPy 2צורה ישנה
ערך חסרnp.nannp.NaN
אינסוףnp.infnp.Inf
סוג float של 64 ביטnp.float64np.float_
שטח מתחת לעקומהnp.trapezoid(y, x)np.trapz(y, x)
האם כל איבר נמצא במערך אחר?np.isin(a, b)np.in1d(a, b)
הערמת שורותnp.vstack([a, a])np.row_stack([a, a])
מכפלהnp.prod(a)np.product(a)
מספרים אקראייםrng = np.random.default_rng(0) rng.random(3)np.random.seed(0) np.random.rand(3)

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

הכול כאן כתוב ל-NumPy 2, הגרסה ש-Coddy מריץ, והטבלה האחרונה מציגה את השמות ש-NumPy 2 הסיר, לצד מה שצריך לכתוב במקומם. רוב הדוגמאות משתמשות ב-a = np.array([3, 1, 4, 1, 5, 9, 2, 6]) וב-m = np.arange(12).reshape(3, 4). חדשים ב-Python עצמו? התחילו עם Python cheat sheet ועם Python playground, ושמרו את דפי העזר של pandas, Matplotlib ו-scikit-learn לצד הדף הזה.

שאלות נפוצות על ה-NumPy Cheat Sheet

האם ה-NumPy cheat sheet הזה חינמי?
כן. ה-NumPy cheat sheet הזה חינמי לגמרי, בלי צורך בהרשמה. שמרו אותו במועדפים, או הדפיסו אותו ל-PDF מהדפדפן, וחזרו אליו בכל פעם שאתם צריכים את הקריאה המדויקת ל-reshape, לסכום לפי axis או להגרלה אקראית.
באיזו גרסה של NumPy דף העזר הזה עוסק?
NumPy 2. כל קטעי הקוד רצים על NumPy 2.4, הגרסה ש-Coddy מריץ. NumPy 2 הסיר כינויים כמו np.NaN, np.float_, np.trapz ו-np.in1d, ולכן הטבלה האחרונה מציגה כל אחד מהם לצד השם הנוכחי שלו.
מה המשמעות של axis=0 ב-NumPy?
ה-axis הוא הממד שמתכווץ. במערך דו-ממדי, axis=0 עובר לאורך השורות, ולכן m.sum(axis=0) מחזיר סכום אחד לכל עמודה. axis=1 עובר לרוחב העמודות ומחזיר סכום אחד לכל שורה. בלי axis, הפונקציה משתמשת בכל האיברים.
מה ההבדל בין view לעותק?
Slice כמו a[1:3] הוא view: הוא חולק זיכרון עם a, ולכן שינוי ה-slice משנה את a. מסכות בוליאניות ורשימות אינדקסים כמו a[a > 2] או a[[0, 2]] מחזירות עותקים. קראו ל-.copy() כשאתם צריכים מערך עצמאי.
למה להשתמש במערך NumPy ולא ברשימה של Python?
מערכים שומרים סוג אחד בבלוק זיכרון אחד, ולכן מתמטיקה על מערך שלם רצה בקוד מקומפל ולעיתים קרובות מהירה פי כמה מלולאה של Python. a * 2 מכפיל כל איבר, בעוד ש-[1, 2] * 2 משכפל את הרשימה. pandas ו-scikit-learn בנויים על מערכי NumPy.
כדאי להשתמש ב-np.random.seed או ב-default_rng?
השתמשו ב-rng = np.random.default_rng(seed) וקראו למתודות על rng, כמו rng.normal() או rng.integers(). זה ה-API המומלץ, עם זרמים אקראיים טובים יותר ובלי state גלובלי נסתר. np.random.seed ו-np.random.rand עדיין עובדים, אבל הם הממשק הישן (legacy).
אפשר להריץ קוד NumPy אונליין?
כן. ה-Matplotlib playground החינמי מריץ Python עם NumPy, pandas, Matplotlib ו-scikit-learn בדפדפן, כך שאפשר להדביק כל קטע קוד מדף העזר הזה ולהריץ אותו בלי להתקין כלום. קורס ה-Machine Learning של Coddy מלמד NumPy צעד אחר צעד, כחלק מעבודה עם נתונים אמיתיים.
איור של שפות התכנות ב-Coddy

ללמוד NumPy עם Coddy

להתחיל