6.8. אופרטורים¶
סוג המתמטיקה הראשון ש-numpy מריץ על ndarray הוא אופרטורי Python הסטנדרטיים. אופרטורים אריתמטיים, אופרטורי השוואה ואופרטורי סיביות פועלים כולם אלמנט-אלמנט – כל אופרטור עובר על המערך (או על שני המערכים) פעם אחת מההתחלה ועד הסוף בתוך קריאת ספרייה יחידה, מהר בהרבה מלולאת for מקבילה ב-Python.
6.8.1. אריתמטיקה¶
+, -, *, /, //, %, ** כולם פועלים בין שני מערכים בעלי צורה תואמת, או בין מערך לסקלר:
a = np.array([1, 2, 3, 4], dtype=np.float)
b = np.array([10, 20, 30, 40], dtype=np.float)
print(a + b) # array([11.0, 22.0, 33.0, 44.0])
print(a * 2) # array([2.0, 4.0, 6.0, 8.0])
print(b - a) # array([9.0, 18.0, 27.0, 36.0])
print(b / a) # array([10.0, 10.0, 10.0, 10.0])
ה-dtype של התוצאה עוקב אחר כללי ההרחבה המתוארים ב-Dtypes. מערכי מספרים שלמים גולשים בעת חריגה (overflow); המירו ל-dtype רחב יותר לפני הפעולה כאשר הדבר חשוב.
אופרטור כפל המטריצות @ אינו ממומש. השתמשו ב-dot() עבור מכפלות מטריצות / וקטורים.
6.8.1.1. צורות במקום (in-place)¶
לכל אופרטור אריתמטי יש צורת במקום – +=, -=, *=, /=, %=, **=. הצורה במקום כותבת דרך החוצץ הקיים במקום להקצות זמני:
b = b + 1 # allocates a temporary the size of b
b += 1 # no temporary
במיקרו-בקר הצורה השנייה היא למעשה חובה עבור כל לולאה חמה.
6.8.2. סיביות¶
אופרטורי הסיביות &, |, ^ פועלים אלמנט-אלמנט על מערכי מספרים שלמים. בהחלתם על מערך float או complex הם מעלים TypeError
a = np.array([0b1100, 0b1010], dtype=np.uint8)
b = np.array([0b1010, 0b1100], dtype=np.uint8)
print(a & b) # array([8, 8], dtype=uint8)
print(a | b) # array([14, 14], dtype=uint8)
print(a ^ b) # array([6, 6], dtype=uint8)
האופרטור האונרי ~ מבצע NOT ברמת הסיביות על מערך מספרים שלמים.
אופרטורי ההזזה << ו->> אינם מחוברים ברמת אופרטור ה-Python. צורות הפונקציה left_shift() ו-right_shift() עובדות:
np.left_shift(a, 2)
np.right_shift(b, 1)
6.8.3. השוואה¶
==, !=, <, <=, >, >= כולם מחזירים ndarray מסוג bool בצורת השידור:
a = np.array([1, 2, 3, 4, 5], dtype=np.uint8)
print(a < 3)
# array([True, True, False, False, False], dtype=bool)
התוצאה הבוליאנית היא בדיוק מה ש-אינדוקס ו-בחירה וסידור מחדש צורכים.
6.8.3.1. כלל הצד¶
ה-ndarray חייב להיות בצד שמאל של אופרטור יחס בעת השוואה לסקלר. a > 2 עובד; 2 < a מעלה TypeError. עבור הצורה הסימטרית, השתמשו בשמות הפונקציות:
np.greater(5, a) # 5 > a, element-wise
np.less(5, a) # 5 < a, element-wise
np.equal(5, a) # 5 == a, element-wise
np.not_equal(5, a) # 5 != a, element-wise
6.8.4. אופרטורים אונריים¶
+a– מחזיר עותק של המערך.-a– שלילה. ב-dtype לא-מסומן הערכים גולשים מודולו \(2^N\), באותו אופן שבו האופרטורים הבינאריים פועלים.abs(a)– ערך מוחלט אלמנט-אלמנט. ב-dtype לא-מסומן מחזיר עותק ללא חישוב.~a– היפוך ברמת הסיביות (מערכי מספרים שלמים בלבד).len(a)– מחזיר את אורך הציר הראשון, בהתאם למוסכמת הרצף של Python.
6.8.5. מה חסר¶
אופרטורי הצד-הימני עבור ההשוואה וחלק מפעולות הסיביות אינם ממומשים באותו אופן שבו ממומשים האופרטורים האריתמטיים. השתמשו בצורות הפונקציה (לעיל) כאשר ndarray ימצא בצד ימין.
לרשימה המלאה של האופרטורים הנתמכים וההרחבה שהם עוקבים אחריה, ראו numpy — פעולות מערך תואמות numpy.