NumPy في بيثون. الجزء 3

مقدمة المترجم


مرحبًا مرة أخرى! استمرار سلسلة مقالاتنا حول ترجمة المانا عن numpy. قراءة جيدة.


عوامل المقارنة واختبار القيمة


يمكن استخدام مقارنة منطقية لمقارنة صفائف من نفس الطول بشكل عنصري. القيمة المرجعة هي صفيف من القيم المنطقية / الخطأ البولية:

>>> a = np.array([1, 3, 0], float) >>> b = np.array([0, 3, 2], float) >>> a > b array([ True, False, False], dtype=bool) >>> a == b array([False, True, False], dtype=bool) >>> a <= b array([False, True, True], dtype=bool) 

يمكن تخزين نتيجة المقارنة في مصفوفة:

 >>> c = a > b >>> c array([ True, False, False], dtype=bool) 

يمكن مقارنة المصفوفات بقيمة واحدة:

 >>> a = np.array([1, 3, 0], float) >>> a > 2 array([False, True, False], dtype=bool) 

يمكن استخدام أي وجميع العوامل لتحديد ما إذا كان عنصر واحد على الأقل أو جميع العناصر صحيحة ، على التوالي:

 >>> c = np.array([ True, False, False], bool) >>> any(c) True >>> all(c) False 

يمكن تطبيق التعبيرات المنطقية المجمعة على المصفوفات على أساس كل عنصر على حدة باستخدام الدالات الخاصة logical_and و logical_or و logical_not:

 >>> a = np.array([1, 3, 0], float) >>> np.logical_and(a > 0, a < 3) array([ True, False, False], dtype=bool) >>> b = np.array([True, False, True], bool) >>> np.logical_not(b) array([False, True, False], dtype=bool) >>> c = np.array([False, True, False], bool) >>> np.logical_or(b, c) array([ True, True, False], dtype=bool) 

تنشئ الدالة المكان صفيفًا جديدًا من صفيفين آخرين بنفس الطول باستخدام مرشح منطقي للتحديد بين عنصرين. البنية الأساسية: حيث (boolarray ،
truearray ، falsearray):

 >>> a = np.array([1, 3, 0], float) >>> np.where(a != 0, 1 / a, a) array([ 1. , 0.33333333, 0. ]) 

باستخدام وظيفة المكان ، يمكن أيضًا إجراء مقارنة الكتلة:

 >>> np.where(a > 0, 3, 2) array([3, 3, 2]) 

تتيح بعض الوظائف إمكانية اختبار القيم في المصفوفة. تُرجع الدالة nonzero مجموعة من مؤشرات القيم غير الصفرية. عدد العناصر في المجموعة يساوي عدد المحاور في الصفيف:

 >>> a = np.array([[0, 1], [3, 0]], float) >>> a.nonzero() (array([0, 1]), array([1, 0])) 

يمكنك أيضًا التحقق من قيم النهايات و NaN (وليس رقمًا):

 >>> a = np.array([1, np.NaN, np.Inf], float) >>> a array([ 1., NaN, Inf]) >>> np.isnan(a) array([False, True, False], dtype=bool) >>> np.isfinite(a) array([ True, False, False], dtype=bool) 

على الرغم من أننا استخدمنا ثوابت numpy هنا لإضافة NaN واللامتناهي ، إلا أنها يمكن أن تكون نتيجة لتطبيق العمليات الرياضية القياسية.

تحديد ومعالجة عناصر المصفوفة


لقد رأينا بالفعل ، كما هو الحال مع القوائم ، يمكن الحصول على عناصر الصفيف باستخدام عملية الوصول بواسطة الفهرس. ومع ذلك ، على عكس القوائم ، تسمح لك المصفوفات أيضًا بتحديد العناصر باستخدام المصفوفات الأخرى. هذا يعني أنه يمكننا استخدام مصفوفة لتصفية مجموعات فرعية محددة من عناصر المصفوفات الأخرى.

يمكن استخدام المصفوفات المنطقية كمصفوفات للتصفية:

 >>> a = np.array([[6, 4], [5, 9]], float) >>> a >= 6 array([[ True, False], [False, True]], dtype=bool) >>> a[a >= 6] array([ 6., 9.]) 

من الجدير بالذكر أنه عندما نقوم بتمرير مصفوفة منطقية a> = 6 كمؤشر لعملية الوصول بواسطة فهرس المصفوفة a ، فإن المصفوفة المرتجعة ستقوم فقط بتخزين القيم الحقيقية. يمكننا أيضًا كتابة مصفوفة للتصفية في متغير:

 >>> a = np.array([[6, 4], [5, 9]], float) >>> sel = (a >= 6) >>> a[sel] array([ 6., 9.]) 

يمكن تحقيق تصفية أكثر تعقيدًا باستخدام التعبيرات المنطقية:

 >>> a[np.logical_and(a > 5, a < 9)] >>> array([ 6.]) 

بالإضافة إلى التحديد المنطقي ، يمكنك أيضًا استخدام المصفوفات الصحيحة. في هذه الحالة ، يقوم الصفيف الصحيح بتخزين مؤشرات العناصر التي سيتم أخذها من الصفيف. خذ بعين الاعتبار المثال التالي أحادي البعد:

 >>> a = np.array([2, 4, 6, 8], float) >>> b = np.array([0, 0, 1, 3, 2, 1], int) >>> a[b] array([ 2., 2., 4., 8., 6., 4.]) 

وبعبارة أخرى ، عندما نستخدم b للحصول على العناصر من a ، فإننا نأخذ العناصر 0 و 0 و 1 و 3 و 2 و 1 من هذا الترتيب. يمكن استخدام القوائم أيضًا كمصفوفات للتصفية:

 >>> a = np.array([2, 4, 6, 8], float) >>> a[[0, 0, 1, 3, 2, 1]] array([ 2., 2., 4., 8., 6., 4.]) 

بالنسبة للمصفوفات متعددة الأبعاد ، نحتاج إلى نقل عدة صفائف صحيحة أحادية البعد إلى فهرس عامل الوصول ( ملاحظة المترجم: في حالتنا ، الفهارس عبارة عن صفائف ) لكل محور. ثم يمر كل من المصفوفات بالتسلسل التالي: العنصر الأول يتوافق مع فهرس الصف ، وهو العنصر الأول من المصفوفة b ، والعنصر الثاني يتوافق مع فهرس العمود ، وهو العنصر الأول من المصفوفة c ، وهكذا. ( ملاحظة للمترجم: المصفوفة الأولى [2 ، 2] والثانية [1 ، 4] ، لدينا عناصر بمؤشرات [2 ، 1] و [2 ، 4] عند الخرج ) مثال:

 >>> a = np.array([[1, 4], [9, 16]], float) >>> b = np.array([0, 0, 1, 1, 0], int) >>> c = np.array([0, 1, 1, 1, 1], int) >>> a[b,c] array([ 1., 4., 16., 16., 4.]) 

تتوفر وظيفة التقاط خاصة للجلب بمصفوفات صحيحة. يعمل هذا تمامًا مثل استخدام عامل التشغيل أخذ على فهرس:

 >>> a = np.array([2, 4, 6, 8], float) >>> b = np.array([0, 0, 1, 3, 2, 1], int) >>> a.take(b) array([ 2., 2., 4., 8., 6., 4.]) 

توفر وظيفة أخذ أيضًا وسيطة المحور لأخذ قسم فرعي من الصفيف متعدد الأبعاد على طول المحور. ( ملاحظة المترجم: صف أو عمود (للمصفوفات ثنائية الأبعاد) ).

 >>> a = np.array([[0, 1], [2, 3]], float) >>> b = np.array([0, 0, 1], int) >>> a.take(b, axis=0) array([[ 0., 1.], [ 0., 1.], [ 2., 3.]]) >>> a.take(b, axis=1) array([[ 0., 0., 1.], [ 2., 2., 3.]]) 

على النقيض من وظيفة أخذ ، هناك وظيفة وضع ، والتي سوف تأخذ القيم من الصفيف الأصلي وكتابتها إلى مؤشرات محددة في صفيف وضع آخر.

 >>> a = np.array([0, 1, 2, 3, 4, 5], float) >>> b = np.array([9, 8, 7], float) >>> a.put([0, 3], b) >>> a array([ 9., 1., 2., 8., 4., 5.]) 

لاحظ أنه لم يتم استخدام القيمة 7 من الصفيف الأصلي b ، حيث تمت الإشارة إلى فهرسين فقط [0 ، 3]. سيتم تكرار المصفوفة الأصلية إذا لزم الأمر إذا لم تتطابق الأطوال:

 >>> a = np.array([0, 1, 2, 3, 4, 5], float) >>> a.put([0, 3], 5) >>> a array([ 5., 1., 2., 5., 4., 5.]) 

مصفوفة ورياضيات الرياضيات


يوفر NumPy العديد من الوظائف للعمل مع المتجهات والمصفوفات. تُرجع دالة النقطة الناتج القياسي للمتجهات:

 >>> a = np.array([1, 2, 3], float) >>> b = np.array([0, 1, 1], float) >>> np.dot(a, b) 5.0 

يمكن أن تضاعف وظيفة النقطة أيضًا المصفوفات:

 >>> a = np.array([[0, 1], [2, 3]], float) >>> b = np.array([2, 3], float) >>> c = np.array([[1, 1], [4, 0]], float) >>> a array([[ 0., 1.], [ 2., 3.]]) >>> np.dot(b, a) array([ 6., 11.]) >>> np.dot(a, b) array([ 3., 13.]) >>> np.dot(a, c) array([[ 4., 0.], [ 14., 2.]]) >>> np.dot(c, a) array([[ 2., 4.], [ 0., 4.]]) 

يمكنك أيضًا الحصول على العدد القياسي ، والموتر ، والمنتج الخارجي للمصفوفات والنواقل. لاحظ أنه بالنسبة للمتجهات ، يتزامن المنتج الداخلي والعددي.

 >>> a = np.array([1, 4, 0], float) >>> b = np.array([2, 2, 1], float) >>> np.outer(a, b) array([[ 2., 2., 1.], [ 8., 8., 4.], [ 0., 0., 0.]]) >>> np.inner(a, b) 10.0 >>> np.cross(a, b) array([ 4., -1., -6.]) 

يوفر NumPy أيضًا مجموعة من الوظائف والأساليب المضمنة للعمل مع الجبر الخطي. يمكن العثور على كل هذا في الوحدة الفرعية linalg. يمكن أيضًا تشغيل هذه الوحدات باستخدام مصفوفات متدهورة وغير متدهورة. يتم البحث عن محدد المصفوفة بهذه الطريقة:

 >>> a = np.array([[4, 2, 0], [9, 3, 7], [1, 2, 1]], float) >>> a array([[ 4., 2., 0.], [ 9., 3., 7.], [ 1., 2., 1.]]) >>> np.linalg.det(a) -48. 

يمكنك أيضًا العثور على المتجه الذاتي والقيمة الذاتية للمصفوفة:

 >>> vals, vecs = np.linalg.eig(a) >>> vals array([ 9. , 2.44948974, -2.44948974]) >>> vecs array([[-0.3538921 , -0.56786837, 0.27843404], [-0.88473024, 0.44024287, -0.89787873], [-0.30333608, 0.69549388, 0.34101066]]) 

يمكن العثور على مصفوفة غير منحلة كما يلي:

 >>> b = np.linalg.inv(a) >>> b array([[ 0.14814815, 0.07407407, -0.25925926], [ 0.2037037 , -0.14814815, 0.51851852], [-0.27777778, 0.11111111, 0.11111111]]) >>> np.dot(a, b) array([[ 1.00000000e+00, 5.55111512e-17, 2.22044605e-16], [ 0.00000000e+00, 1.00000000e+00, 5.55111512e-16], [ 1.11022302e-16, 0.00000000e+00, 1.00000000e+00]]) 

يمكن تحقيق تحلل واحد (تناظري لقطرية مصفوفة غير مربعة) على النحو التالي:

 >>> a = np.array([[1, 3,4], [5, 2, 3]], float) >>> U, s, Vh = np.linalg.svd(a) >>> U array([[-0.6113829 , -0.79133492], [-0.79133492, 0.6113829 ]]) >>> s array([ 7.46791327, 2.86884495]) >>> Vh array([[-0.61169129, -0.45753324, -0.64536587], [ 0.78971838, -0.40129005, -0.46401635], [-0.046676 , -0.79349205, 0.60678804]]) 

ننتهي من الجزء الثالث. حظا سعيدا ونراكم قريبا!

Source: https://habr.com/ru/post/ar413381/


All Articles