DR. IGOR DATA SCIENCEAI, Data & Creativity · From Data to Impact
הרצאה 1 · נושא 8/10
אלגברה ליניארית למדעי הנתונים

וקטורים ב-Python וב-NumPy

מייצוג ברשימה ועד slicing, aliasing, וקטורים מיוחדים, הפרשים וגרפים.

Python list
[1, 2, 3]
NumPy array
np.array([1,2,3])
01

סביבת עבודה

הקורס מציג שתי אפשרויות: התקנה מקומית או עבודה בדפדפן.

02

וקטור כרשימת Python

הייצוג הפשוט ביותר.

Listהגדרה ואינדקסים
x = [10, 20, 30, 40]

print(x[0])    # 10 — האיבר הראשון
print(x[2])    # 30
print(x[-1])   # 40 — האיבר האחרון
הבדל קריטי: במתמטיקה מתחילים לספור מ-1. ב-Python מתחילים מ-0. האינדקס -1 מחזיר את האיבר האחרון.
03

הגדרת וקטור באמצעות NumPy

כאשר חשובה יעילות ועבודה מתמטית על מערכים.

NumPy arrayיצירה ושינוי ערך
import numpy as np

x = np.array([10, 20, 30, 40])
x[1] = 99

print(x)
# [10 99 30 40]

למה NumPy?

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

\[x\in\mathbb{R}^4\qquad\leftrightarrow\qquad x.shape=(4,)\]
04

העתקה מול ALIASING

פעולת השמה אינה תמיד יוצרת עותק חדש.

Aliasing

x = np.array([1, 2, 3])
y = x
y[0] = 99

print(x)
# [99  2  3]
x
same array
y
same array

עותק אמיתי

x = np.array([1, 2, 3])
y = x.copy()
y[0] = 99

print(x)
# [1 2 3]
כלל בטוח: השתמשו ב-.copy() כאשר אתם צריכים מערך עצמאי.
05

שוויון בין וקטורים

רשימות ו-NumPy מתנהגים אחרת.

Listsתוצאה בוליאנית אחת
a = [1, 2, 3]
b = [1, 2, 3]

print(a == b)
# True
NumPyבדיקה איבר־איבר
a = np.array([1, 2, 3])
b = np.array([1, 2, 3])

print(a == b)
# [ True  True  True ]

print(np.array_equal(a, b))
# True
06

סקלר לעומת 1-וקטור

בספר לעיתים מזהים 1-וקטור עם סקלר; בקוד אלה עצמים שונים.

סקלר

a = 5
type(a)
# int

רשימה באורך 1

x = [5]
len(x)
# 1

מערך NumPy באורך 1

x = np.array([5])
x.shape
# (1,)
שימו לב: ב-NumPy הביטוי x == 5 מתבצע איבר־איבר ומחזיר מערך בוליאני.
07

וקטור של בלוקים

בונים וקטור ארוך מכמה וקטורים.

נכוןconcatenate
x = np.array([1, 2])
y = np.array([10, 20, 30])

t = np.concatenate([x, y])

print(t)
# [ 1  2 10 20 30]
טעויות נפוצותמבנה מקונן
t1 = (x, y)    # tuple of arrays
t2 = [x, y]    # list of arrays

# אלה אינם וקטור שטוח אחד
08

תת־וקטור ו-slicing

האינדקס הימני אינו נכלל.

0
10
1
20
2
30
3
40
4
50
5
60
\[x[1:5]\longrightarrow \text{indices }1,2,3,4\]
יצירת תת־וקטורslice
x = np.array([10, 20, 30, 40, 50, 60])

sub = x[1:5]
print(sub)
# [20 30 40 50]
שינוי חלק מן הווקטורslice assignment
x[1:4] = 0

print(x)
# [10  0  0  0 50 60]
09

קיצורי דרך ודוגמאות נוספות

התחלה, סוף, דילוג והיפוך.

x[:3]שלושת האיברים הראשונים
x[3:]מן האינדקס 3 ועד הסוף
x[::2]כל איבר שני
x[::-1]היפוך הסדר
דוגמהכמה slices
x = np.array([1, 2, 3, 4, 5, 6])

print(x[:3])    # [1 2 3]
print(x[3:])    # [4 5 6]
print(x[::2])   # [1 3 5]
print(x[::-1])  # [6 5 4 3 2 1]
10

וקטור הפרשים — lag 1

שימושי בעיבוד אותות ובסדרות עתיות.

\[ \Delta x= (x_2-x_1,\ x_3-x_2,\ldots,x_n-x_{n-1}) \]

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

NumPyשני slices
x = np.array([10, 13, 12, 20, 25])

differences = x[1:] - x[:-1]

print(differences)
# [ 3 -1  8  5]
11

רשימות ווקטורים מיוחדים

המשך ישיר של שקופיות 96–100.

רשימת וקטוריםvectors = [x, y, z]
וקטור אפסיםnp.zeros(5)
וקטור אחדיםnp.ones(5)
וקטור יחידהnp.eye(5)[2]
מספרים אקראייםgenerator מומלץ
rng = np.random.default_rng(42)

x = rng.normal(size=100)

print(x[:5])
12

גרפים

וקטור ערכים מוצג כקו לאורך האינדקסים.

Matplotlibplot + show
import matplotlib.pyplot as plt

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

plt.plot(x, marker="o")
plt.xlabel("Index")
plt.ylabel("Value")
plt.title("Vector values")
plt.grid()
plt.show()
13

תרגול קצר

אינדקסים, העתקה ו-slicing.

משימה 1

x = np.array([5, 10, 15, 20, 25, 30])

מה מחזירים x[-1], x[1:5] ו-x[::2]?

30
[10 15 20 25]
[ 5 15 25]

משימה 2

x = np.array([1, 2, 3])
y = x
y[1] = 99

מהו כעת x, וכיצד למנוע זאת?

x == [1, 99, 3]

y = x.copy()
14

Take-home message

המעבר מן הסימון המתמטי לקוד.

1Python מתחיל אינדקסים מ-0 ותומך ב--1.
2NumPy הוא הייצוג המרכזי לפעולות וקטוריות.
3השמה יכולה ליצור alias; עותק עצמאי דורש .copy().
4ב-NumPy השוואה עם == היא איבר־איבר.
5ב-slicing הגבול הימני אינו נכלל.
6הפרשים עוקבים מתקבלים באמצעות x[1:] - x[:-1].

מפת כיסוי

שקופיות 76–101 נשמרו והורחבו.

שקופיותהחומר המקוריהמיקום החדש
76כותרת 1.7 — וקטורים בפייתוןHero
77–80Anaconda, Colab וקורס Python בסיסיסביבת עבודה וכרטיסי קישור
81–82רשימה, אינדקס מ-0 ואינדקס ‎−1וקטור כרשימה
83–84NumPy ושינוי ערךמערך NumPy
85Aliasingהשמה מול .copy()
86–87שוויון במערכים וברשימותהשוואה בין שני סוגי הייצוג
88–89סקלר לעומת 1-וקטורשלושה טיפוסים ו-shape
90וקטור בלוקים וטעויות נפוצותconcatenate מול tuple/list
91–94יצירה, שינוי וקיצורי דרך של תת־וקטורslicing, assignment וקיצורים
95וקטור הפרשים lag 1נוסחה וקוד
96–100רשימת וקטורים, אפסים, יחידה, אחדים ואקראייםבוני וקטורים
101גרפיםMatplotlib + המחשה