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). ومصفوفات الأعداد الصحيحة تلتفّ عند التجاوز؛ فحوّل إلى 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-- النفي. على الأنواع غير المؤشَّرة (unsigned) تلتفّ القيم بمقياس \(2^N\)، بالطريقة نفسها التي تفعلها العوامل الثنائية.abs(a)-- القيمة المطلقة عنصرًا بعنصر. على الأنواع غير المؤشَّرة تعيد نسخة دون حساب.~a-- القلب البتي (لمصفوفات الأعداد الصحيحة فقط).len(a)-- تعيد طول المحور الأول، بما يطابق عُرف تسلسلات Python.
6.8.5. ما المفقود¶
عوامل الجانب الأيمن للمقارنة وبعض العمليات البتية ليست منفَّذة بالطريقة نفسها التي تُنفَّذ بها العوامل الحسابية. استخدم الصيغ الدالّيّة (أعلاه) عندما يقع ndarray على اليمين.
للاطلاع على القائمة الكاملة للعوامل المدعومة والترقية التي تتبعها، راجع numpy --- عمليات المصفوفات المتوافقة مع numpy.