استنساخ Numpy

صورة

وحدة صغيرة للعمل مع المصفوفات في بيثون دون استخدام مكتبات الطرف الثالث (استنساخ NumPy ، ولكن فقط في بيثون النقي).

طُلب من الواجب المنزلي في الجامعة كتابة برنامج يحسب القواعد والتفسيرات في المصفوفة ، لكن يُحظر استخدام مكتبات الطرف الثالث. اختيار لغة البرمجة غير محدود. اخترت الثعبان (الذي كان خطأ ، لأنه أبطأ بكثير من Java و C / C ++) وبالتالي لا يمكنني استخدام NumPy. في هذه العملية ، اضطررت إلى كتابة وظائف لأداء عمليات مع المصفوفات ، وظائف لإيجاد القصر ، المحددات ، إلخ. والنتيجة هي مكتبة صغيرة للعمل مع المصفوفات.

رمز الثعبان الخالص الخاص بي أبطأ بكثير من NumPy ، والذي يقوم بحسابات C و Fortran (بالإضافة إلى أن الكود غير محسن).

ماذا يمكن أن MatLOL:

  • مجموع والفرق والمنتج من المصفوفات
  • مصفوفة المنتج حسب العدد
  • مصفوفة نقل
  • المصفوفة الصغرى
  • محدد المصفوفة
  • المصفوفة العكسية
  • مصفوفة الاتحاد
  • رقم شرط المصفوفة
  • قواعد المصفوفة الأولى والثانية (غير النهائية) والمصفوفة الإقليدية والمحدودة
  • حل المعادلة AX = B
  • LU التحلل
  • تشولسكي التحلل
  • طريقة سيدل

أمثلة MathLOL


استيراد الوحدة النمطية:

# from mathlol import * from mathlol import mathlol 

تهيئة المصفوفة

 matrix = mathlol() matrix.set([[1, 2, 3], [4, 5, 6], [7, -8, 9]]) matrix.get() #   

بعض عمليات المصفوفة

 matrix * 2 #     2 A = [[0, 0, 0], [0, 1, 0], [0, 0, 0]] #  2  matrix.dot(A) matrix * A matrix.transposition() #   matrix.minor(i = 0, j = 0) #   matrix.determinant() #   matrix.inverse() #   L, U = matrix.lu() # LU  matrix.seidel(b = [[5.0], [9.0], [1.0]]) #   

هناك أيضا وظائف للعمل مع ناقلات

 vector = mathlol() vector.set([1, 2, 3, 4, 5]) vector.checkvector() # ,     vector.norm1_vector() vector.norm2_vector() vector.norm3_vector() 

أمثلة أخرى

أداء MathLOL


دعونا نرى سرعة منتجات الحوسبة من المصفوفات من حجم NxN. تمتلئ المصفوفات بأعداد صحيحة عشوائية من 100 إلى 100.

قانون
 from mathlol import mathlol import time import random import matplotlib.pyplot as plt #    data = {} for i in range(10, 110, 10): array = [] for i_ in range(i): temp = [] for j_ in range(i): temp.append(random.randint(-100, 100)) array.append(temp) data[i] = array #      mlol_dot = {} for key in data.keys(): matrix = mathlol() matrix.set(matrix = data[key]) start = time.process_time() result = matrix * matrix end = time.process_time() - start mlol_dot[key] = end #   plt.plot(mlol_dot.keys(), mlol_dot.values()) plt.title("MathLOL \n ") plt.xlabel("  (NxN)") plt.ylabel(" ()") 


صورة

سرعة حساب أحجام مصفوفة المنتج من 100x100 إلى 1000x1000

صورة

قارن بين السرعة الحسابية لل numpy و mathlol. لسوء الحظ ، كانت mathlol بطيئة للغاية في السرعة وقررت أن تأخذ مصفوفات لأحجام المصفوفة المبتذلة من 100x100 إلى 1000x1000 ، وللماثلول من 10x10 إلى 100x100.

صورة

قام MathLOL بحساب منتج المصفوفة 100 × 100 بمفرده في 0.16 ثانية ، وحساب NumPy منتج المصفوفة 1000 × 1000 بنفسه في 0.002 (!!!) ثانية. الفرق كبير.

كانت مهمتنا ببساطة هي تنفيذ وظائف مختلفة للعمل مع المصفوفات ، وهو ما قمنا به ، لكن البرنامج ذو المصفوفات الكبيرة لا يعمل بالسرعة التي نرغب فيها. يبقى تحسين البرنامج ، وإضافة المزيد من الوظائف (على سبيل المثال ، وظيفة لحساب عدد تود) ، وسأكون ممتنا إذا نظرت إلى الكود ، وأشرت إلى الأخطاء ، وربما ساعدت في تحسين الكود.

هذا كل شيء ، يتم نشر الكود والأمثلة على جيثب .

ملحوظة: في أثناء كتابة المقال ، أردت تجربة C / C ++ ودمجها في الوحدة النمطية الخاصة بي. سأعتني بهذا في المستقبل القريب وأرى مدى قربه من أداء NumPy.

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


All Articles