دليل SciPy التعليمي: ما هو SciPy؟ (مع أمثلة)

⚡ ملخص ذكي

SciPy هو برنامج مفتوح المصدر Python مكتبة للحوسبة العلمية والتقنية، مبنية على NumPy. ستتعرف هنا على حزمها الفرعية الرئيسية لإدخال/إخراج الملفات، والجبر الخطي، والتحسين، وتحويلات فورييه، والتكامل، ومعالجة الصور مع أمثلة توضيحية.

  • 🔬 ما هو : SciPy هو Python مكتبة للحوسبة في الرياضيات والعلوم والهندسة.
  • 🧱 تم البناء على NumPy: تُوسّع مكتبة SciPy مكتبة NumPy بحزم فرعية علمية متقدمة.
  • 📐 الجبر الخطي: تقوم مكتبة scipy.linalg بحساب المحددات والمعكوسات والقيم الذاتية.
  • 📈 الاقوي: تقوم الدالة scipy.optimize بتقليل الدوال ومطابقة المنحنيات.
  • 🖼️ الصور والإشارات: تتعامل scipy.ndimage و scipy.fftpack مع الصور وتحويلات فورييه.
  • 🤖 مساعدة الذكاء الاصطناعي: تقوم أدوات الذكاء الاصطناعي مثل Copilot بإنشاء كود SciPy للمهام العلمية.

سيبي في Python

سيبي في Python

سيبي في Python هي مكتبة مفتوحة المصدر تستخدم لحل المشكلات الرياضية والعلمية والهندسية والتقنية. فهو يسمح للمستخدمين بمعالجة البيانات وتصور البيانات باستخدام مجموعة واسعة من المستويات العالية Python الأوامر. تم بناء SciPy على Python امتداد NumPy. يتم نطق SciPy أيضًا باسم "Sigh Pi".

الحزم الفرعية لـ SciPy:

لماذا استخدام SciPy

  • يحتوي SciPy على مجموعة متنوعة من الحزم الفرعية التي تساعد في حل المشكلة الأكثر شيوعًا المتعلقة بالحسابات العلمية.
  • حزمة SciPy في Python هي المكتبة العلمية الأكثر استخدامًا في المرتبة الثانية بعد مكتبة GNU العلمية لـ C/C++ أو ماتلاب.
  • سهل الاستخدام والفهم بالإضافة إلى القوة الحسابية السريعة.
  • يمكنه العمل على مجموعة من مكتبة NumPy.

نومبي مقابل سكيبي

نمباي

  • Numpy مكتوب بلغة C ويستخدم في العمليات الحسابية أو الحسابية الرقمية.
  • إنه أسرع من غيره Python المكتبات
  • Numpy هي المكتبة الأكثر فائدة لعلوم البيانات لإجراء العمليات الحسابية الأساسية.
  • لا تحتوي مكتبة NumPy إلا على نوع بيانات المصفوفة الذي يقوم بالعمليات الأساسية مثل الفرز والتجزئة.ping، والفهرسة، وما إلى ذلك.

SciPy

  • تم بناء SciPy أعلى NumPy
  • وحدة SciPy في Python هي نسخة كاملة المواصفات من Linear Algebra بينما تحتوي Numpy على عدد قليل من الميزات فقط.
  • تتوفر معظم ميزات علوم البيانات الجديدة في Scipy بدلاً من Numpy.

SciPy – التثبيت وإعداد البيئة

يمكنك أيضًا تثبيت SciPy في Windows عبر النقطة

Python3 -m pip install --user numpy scipy 

قم بتثبيت Scipy على نظام Linux

sudo apt-get install  python-scipy python-numpy

قم بتثبيت SciPy في نظام Mac

sudo port install py35-scipy py35-numpy

قبل أن نبدأ في تعلم SciPy Python، فأنت بحاجة إلى معرفة الوظائف الأساسية بالإضافة إلى أنواع مختلفة من مجموعة من نمباي

الطريقة القياسية لاستيراد وحدات SciPy وNumpy:

from scipy import special   #same for other modules
import numpy as np

حزمة إدخال / إخراج الملف

تحتوي حزمة Scipy، I/O، على مجموعة واسعة من الوظائف للعمل مع تنسيقات ملفات مختلفة وهي Matlab وArff وWave وMatrix Market وIDL وNetCDF وTXT وCSV والتنسيق الثنائي.

دعونا نأخذ تنسيق ملف واحد Python مثال SciPy الذي يتم استخدامه بانتظام في MatLab:

 import numpy as np
 from scipy import io as sio
 array = np.ones((4, 4))
 sio.savemat('example.mat', {'ar': array}) 
 data = sio.loadmat(‘example.mat', struct_as_record=True)
 data['ar']

الإخراج:

array([[ 1., 1., 1., 1.],
           [ 1., 1., 1., 1.],
           [ 1., 1., 1., 1.],
           [ 1., 1., 1., 1.]])

Code تفسير

  • السطر 1 و 2: قم باستيراد مكتبة SciPy الأساسية في Python مع حزمة الإدخال/الإخراج وNumpy.
  • خط 3: قم بإنشاء مصفوفة ذات أبعاد 4 × 4
  • خط 4: تخزين المصفوفة في example.mat ملف.
  • خط 5: الحصول على البيانات من example.mat ملف
  • خط 6: طباعة الإخراج.

حزمة الوظائف الخاصة

  • scipy.special تحتوي الحزمة على العديد من وظائف الفيزياء الرياضية.
  • تشتمل وظيفة SciPy الخاصة على الجذر التكعيبي، والأسي، والمجموع اللوغاريتمي الأسي، ولامبرت، والتبديل والتركيبات، وجاما، وبسل، والهندسة الفائقة، وكلفن، وبيتا، والأسطوانة المكافئة، والخطأ النسبي الأسي، وما إلى ذلك.
  • للحصول على وصف سطر واحد لكل هذه الوظائف، اكتب Python وحدة التحكم:
help(scipy.special)	
Output:
NAME
    scipy.special

DESCRIPTION
    ========================================
    Special functions (:mod:`scipy.special`)
    ========================================
     
    .. module:: scipy.special
     
    Nearly all of the functions below are universal functions and follow
    broadcasting and automatic array-looping rules. Exceptions are noted.

وظيفة الجذر التكعيبي

تقوم دالة الجذر التكعيبي بالعثور على الجذر التكعيبي للقيم.

بناء الجملة:

scipy.special.cbrt(x)

على سبيل المثال:

from scipy.special import cbrt
#Find cubic root of 27 & 64 using cbrt() function
cb = cbrt([27, 64])
#print value of cb
print(cb)

الإخراج: صفيف ([3. ، 4.])

الدالة الأسية:

تحسب الدالة الأسيّة 10**x على مستوى العناصر.

على سبيل المثال:

from scipy.special import exp10
#define exp10 function and pass value in its
exp = exp10([1,10])
print(exp)

الإخراج: [1.ه+01 1.ه+10]

التباديل والتوليفات

يوفر SciPy أيضًا وظيفة لحساب التباديل والتركيبات.

مجموعات - scipy.special.comb(N,k)

على سبيل المثال:

from scipy.special import comb
#find combinations of 5, 2 values using comb(N, k)
com = comb(5, 2, exact = False, repetition=True)
print(com)

الإخراج: 15.0

التباديل –

scipy.special.perm(N,k)

على سبيل المثال:

from scipy.special import perm
#find permutation of 5, 2 using perm (N, k) function
per = perm(5, 2, exact = True)
print(per)

الإخراج: 20

سجل مجموع الدالة الأسية

يقوم Log Sum الأسي بحساب سجل عنصر الإدخال الأسي الإجمالي.

بناء الجملة :

scipy.special.logsumexp(x) 

وظيفة بيسل

دالة حساب ترتيب الأعداد الصحيحة

بناء الجملة :

scipy.special.jn()

الجبر الخطي مع SciPy

  • الجبر الخطي لـ SciPy هو تطبيق لمكتبات BLAS وATLAS LAPACK.
  • أداء الجبر الخطي سريع جدًا مقارنة بـ BLAS وLAPACK.
  • يقبل روتين الجبر الخطي كائن مصفوفة ثنائية الأبعاد ويكون الإخراج أيضًا مصفوفة ثنائية الأبعاد.

الآن دعونا نقوم ببعض الاختبارات مع scipy.linalg,

حساب مقرر مصفوفة ثنائية الأبعاد،

from scipy import linalg
import numpy as np
#define square matrix
two_d_array = np.array([ [4,5], [3,2] ])
#pass values to det() function
linalg.det( two_d_array )

الإخراج: -7.0

مصفوفة معكوسة –

scipy.linalg.inv()

المصفوفة العكسية لـ Scipy تحسب معكوس أي مصفوفة مربعة.

لنرى،

from scipy import linalg
import numpy as np
# define square matrix
two_d_array = np.array([ [4,5], [3,2] ])
#pass value to function inv()
linalg.inv( two_d_array )

الإخراج:

array( [[-0.28571429,  0.71428571],
       [ 0.42857143, -0.57142857]] )

القيم الذاتية والمتجهات الذاتية

scipy.linalg.eig ()

  • المشكلة الأكثر شيوعًا في الجبر الخطي هي القيم الذاتية والمتجهات الذاتية والتي يمكن حلها بسهولة باستخدام إيج ()وظيفة.
  • الآن دعونا نجد القيمة الذاتية لـ (X) وتتوافق مع المتجهات الذاتية لمصفوفة مربعة ثنائية الأبعاد.

مثال

from scipy import linalg
import numpy as np
#define two dimensional array
arr = np.array([[5,4],[6,3]])
#pass value into function
eg_val, eg_vect = linalg.eig(arr)
#get eigenvalues
print(eg_val)
#get eigenvectors
print(eg_vect)

الإخراج:

[ 9.+0.j -1.+0.j] #eigenvalues
 [ [ 0.70710678 -0.5547002 ] #eigenvectors
   [ 0.70710678  0.83205029] ]

تحويل فورييه المنفصل – scipy.fftpack

  • DFT هي تقنية رياضية تستخدم في تحويل البيانات المكانية إلى بيانات ترددية.
  • FFT (تحويل فورييه السريع) هي خوارزمية لحساب DFT
  • يتم تطبيق FFT على مجموعة متعددة الأبعاد.
  • يحدد التردد عدد الإشارة أو الطول الموجي في فترة زمنية معينة.

على سبيل المثال: خذ موجة وأظهر باستخدام مكتبة Matplotlib. نأخذ مثال دالة دورية بسيطة لـ sin(20 × 2πt)

%matplotlib inline
from matplotlib import pyplot as plt
import numpy as np 

#Frequency in terms of Hertz
fre  = 5 
#Sample rate
fre_samp = 50
t = np.linspace(0, 2, 2 * fre_samp, endpoint = False )
a = np.sin(fre  * 2 * np.pi * t)
figure, axis = plt.subplots()
axis.plot(t, a)
axis.set_xlabel ('Time (s)')
axis.set_ylabel ('Signal amplitude')
plt.show()

الإخراج:

تحويل فورييه المنفصل

يمكنك رؤية هذا. التردد 5 هرتز وتتكرر إشارته خلال 1/5 ثانية - وتسمى بفترة زمنية معينة.

الآن دعونا نستخدم هذه الموجة الجيبية بمساعدة تطبيق DFT.

from scipy import fftpack

A = fftpack.fft(a)
frequency = fftpack.fftfreq(len(a)) * fre_samp
figure, axis = plt.subplots()

axis.stem(frequency, np.abs(A))
axis.set_xlabel('Frequency in Hz')
axis.set_ylabel('Frequency Spectrum Magnitude')
axis.set_xlim(-fre_samp / 2, fre_samp/ 2)
axis.set_ylim(-5, 110)
plt.show()

الإخراج:

تحويل فورييه المنفصل

  • يمكنك أن ترى بوضوح أن الإخراج عبارة عن مصفوفة أحادية البعد.
  • المدخلات التي تحتوي على قيم معقدة تكون صفرًا باستثناء نقطتين.
  • في مثال DFT، نتصور حجم الإشارة.

التحسين والملاءمة في SciPy – scipy.optimize

  • يوفر التحسين خوارزمية مفيدة لتقليل ملائمة المنحنى أو متعددة الأبعاد أو العددية والجذرية.
  • لنأخذ مثالا على دالة عددية,للعثور على الحد الأدنى من وظيفة العددية.
%matplotlib inline
import matplotlib.pyplot as plt
from scipy import optimize
import numpy as np

def function(a):
       return   a*2 + 20 * np.sin(a)
plt.plot(a, function(a))
plt.show()
#use BFGS algorithm for optimization
optimize.fmin_bfgs(function, 0) 

الإخراج:

التحسين والملاءمة في SciPy

تم إنهاء التحسين بنجاح.

قيمة الوظيفة الحالية: -23.241676

التكرارات: 4

تقييمات الوظيفة: 18

تقييمات التدرج: 6

صفيف ([-1.67096375])

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

تحسين.باسينهوبping(دالة، 0)

الإخراج:

fun: -23.241676238045315
 lowest_optimization_result:
      fun: -23.241676238045315
 hess_inv: array([[0.05023331]])
      jac: array([4.76837158e-07])
  message: 'Optimization terminated successfully.'
     nfev: 15
      nit: 3
     njev: 5
   status: 0
  success: True
        x: array([-1.67096375])
                    message: ['requested number of basinhopping iterations completed successfully']
      minimization_failures: 0
                       nfev: 1530
                        nit: 100
                       njev: 510
               x: array([-1.67096375])

خوارزمية نيلدر-ميد:

  • تختار خوارزمية Nelder-Mead من خلال معلمة الطريقة.
  • إنه يوفر الطريقة الأكثر مباشرة لتقليل الأداء العادل.
  • لا يتم استخدام خوارزمية Nelder – Mead لتقييمات التدرج لأنها قد تستغرق وقتًا أطول للعثور على الحل.
import numpy as np
from scipy.optimize import minimize
#define function f(x)
def f(x):   
    return .4*(1 - x[0])**2
  
optimize.minimize(f, [2, -1], method="Nelder-Mead")

الإخراج:

final_simplex: (array([[ 1.        , -1.27109375],
       [ 1.        , -1.27118835],
       [ 1.        , -1.27113762]]), array([0., 0., 0.]))
           fun: 0.0
       message: 'Optimization terminated successfully.'
          nfev: 147
           nit: 69
        status: 0
       success: True
             x: array([ 1.        , -1.27109375])

معالجة الصور باستخدام SciPy – scipy.ndimage

  • scipy.ndimage هي وحدة فرعية من SciPy تُستخدم في الغالب لإجراء عملية متعلقة بالصورة
  • ndimage تعني الصورة ذات الأبعاد "n".
  • توفر مكتبة SciPy لمعالجة الصور تحويلات هندسية (تدوير، قص، قلب)، وتصفية الصور (تحسين الحدة وإزالة التشويش)، وعرض الصور، وتجزئة الصور، وتصنيفها، واستخراج الميزات، على سبيل المثالtracنشوئها.
  • حزمة MISC يحتوي SciPy على صور تم إنشاؤها مسبقًا والتي يمكن استخدامها لأداء مهمة معالجة الصور

على سبيل المثال: لنأخذ مثالاً على التحول الهندسي للصور

from scipy import misc
from matplotlib import pyplot as plt
import numpy as np
#get face image of panda from misc package
panda = misc.face()
#plot or show image of face
plt.imshow( panda )
plt.show()

الإخراج:

معالجة الصور باستخدام SciPy

الآن نحن الوجه إلى أسفل الصورة الحالية:

#Flip Down using scipy misc.face image  
flip_down = np.flipud(misc.face())
plt.imshow(flip_down)
plt.show()

الإخراج:

معالجة الصور باستخدام SciPy

على سبيل المثال: تدوير الصورة باستخدام Scipy،

from scipy import ndimage, misc
from matplotlib import pyplot as plt
panda = misc.face()
#rotatation function of scipy for image – image rotated 135 degree
panda_rotate = ndimage.rotate(panda, 135)
plt.imshow(panda_rotate)
plt.show()

الإخراج:

معالجة الصور باستخدام SciPy

التكامل مع Scipy – التكامل العددي

  • عندما نقوم بتكامل أي دالة حيث التكامل التحليلي غير ممكن، نحتاج إلى اللجوء إلى التكامل العددي
  • يوفر SciPy وظائف لدمج الوظيفة مع التكامل العددي.
  • scipy.integrate تحتوي المكتبة على التكامل الفردي، المزدوج، الثلاثي، المتعدد، المربع الغاوسي، رومبرج، شبه المنحرف وقواعد سيمبسون.

على سبيل المثال: الآن خذ مثالا على التكامل الفردي

التكامل مع سكيبي

هنا a هو الحد الأعلى و b هو الحد الأدنى

from scipy import integrate
# take f(x) function as f
f = lambda x : x**2
#single integration with a = 0 & b = 1  
integration = integrate.quad(f, 0 , 1)
print(integration)

الإخراج:

(0.33333333333333337، 3.700743415417189e-15)

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

مثال: الآن خذ مثال SciPy لـ التكامل المزدوج. نجد التكامل المزدوج للمعادلة التالية،

التكامل مع سكيبي

from scipy import integrate
import numpy as np
#import square root function from math lib
from math import sqrt
# set  fuction f(x)
f = lambda x, y : 64 *x*y
# lower limit of second integral
p = lambda x : 0
# upper limit of first integral
q = lambda y : sqrt(1 - 2*y**2)
# perform double integration
integration = integrate.dblquad(f , 0 , 2/4,  p, q)
print(integration)

الإخراج:

(3.0، 9.657432734515774e-14)

لقد رأيت أن الإخراج أعلاه هو نفس الناتج السابق.

الأسئلة الشائعة

SciPy هو برنامج مفتوح المصدر Python مكتبة للحوسبة العلمية والتقنية. مبنية على NumPy، توفر حزمًا فرعية للجبر الخطي، والتحسين، والتكامل، ومعالجة الإشارات، وغير ذلك.

يوفر NumPy نوع بيانات المصفوفة الأساسية والعمليات الأساسية، بينما يعتمد SciPy على NumPy لإضافة وظائف علمية متقدمة مثل التحسين والتكامل والجبر الخطي الكامل.

قم بتثبيت SciPy باستخدام pip عبر الأمر pip install scipy، والذي يقوم أيضاً بتثبيت NumPy. على أنظمة Linux وMac، يمكنك استخدام مدير حزم النظام بدلاً من ذلك.

توفر مكتبة scipy.linalg إجراءات الجبر الخطي المبنية على مكتبتي BLAS و LAPACK. وهي تحسب المحددات ومعكوسات المصفوفات والقيم الذاتية والمتجهات الذاتية للمصفوفات ثنائية الأبعاد بسرعة.

توفر مكتبة scipy.optimize خوارزميات لتقليل الدوال، ومطابقة المنحنيات، وإيجاد الجذور. وهي تتضمن طرقًا مثل BFGS وbasin-hop.pingوخوارزمية نيلدر-ميد.

مساعدو الذكاء الاصطناعي مثل GitHub Copilot يقومون بإكمال استدعاءات وظائف SciPy تلقائيًا، ويقترحون الحزمة الفرعية المناسبة للمهمة، ويولدون أمثلة عملية للتحسين أو التكامل أو معالجة الإشارات.

نعم. يمكن للأدوات المدعومة بالذكاء الاصطناعي أتمتة كتابة مسارات SciPy، واختيار الخوارزميات المناسبة، وإعادة هيكلة الحلقات العددية البطيئة إلى عمليات NumPy وSciPy المتجهة لتحسين الأداء.

نعم. تتولى الحزمة الفرعية scipy.ndimage عمليات الصور مثل التدوير والقلب.ping، اقتصاصping، والتصفية، والتجزئة، والعمل على الصور كمصفوفات NumPy متعددة الأبعاد.

تلخيص هذه التدوينة بـ: