SciPy w Python Samouczek: Co to jest, biblioteka, funkcja i przykłady

SciPy w Python

SciPy w Python to biblioteka typu open source służąca do rozwiązywania problemów matematycznych, naukowych, inżynieryjnych i technicznych. Pozwala użytkownikom manipulować danymi i wizualizować dane przy użyciu szerokiego zakresu wysokiego poziomu Python polecenia. SciPy jest zbudowany na Python Rozszerzenie NumPy. SciPy jest również wymawiane jako „Sigh Pi”.

Podpakiety SciPy:

Dlaczego warto używać SciPy

  • SciPy zawiera różne podpakiety, które pomagają rozwiązać najczęstszy problem związany z obliczeniami naukowymi.
  • Pakiet SciPy w Python jest najczęściej używaną biblioteką naukową, zaraz po Bibliotece Naukowej GNU dla C/C++ lub Matlaba.
  • Łatwy w użyciu i zrozumieniu, a także szybka moc obliczeniowa.
  • Może operować na tablicy bibliotek NumPy.

Numpy kontra SciPy

Odrętwiały

  • Numpy jest napisany w C i służy do obliczeń matematycznych lub numerycznych.
  • Jest szybszy niż inne Python biblioteki
  • Numpy to najbardziej przydatna biblioteka dla Data Science do wykonywania podstawowych obliczeń.
  • Numpy zawiera wyłącznie tablicę danych, która wykonuje najbardziej podstawowe operacje, takie jak sortowanie, kształtowanie, indeksowanie itp.

SciPy

  • SciPy jest wbudowany w NumPy
  • Moduł SciPy w Python to w pełni funkcjonalna wersja algebry liniowej, podczas gdy Numpy zawiera tylko kilka funkcji.
  • Większość nowych funkcji Data Science jest dostępna w Scipy, a nie w Numpy.

SciPy – instalacja i konfiguracja środowiska

Możesz także zainstalować SciPy w Windows przez pipa

Python3 -m pip install --user numpy scipy 

Zainstaluj Scipy na Linuksie

sudo apt-get install  python-scipy python-numpy

Zainstaluj SciPy na komputerze Mac

sudo port install py35-scipy py35-numpy

Zanim zaczniemy uczyć się SciPy Python, musisz znać podstawową funkcjonalność, a także różne typy tablic numpy

Standardowy sposób importowania modułów SciPy i Numpy:

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

Pakiet wejścia/wyjścia pliku

Scipy, pakiet I/O, posiada szeroką gamę funkcji do pracy z różnymi formatami plików, takimi jak Matlab, Arff, Wave, Matrix Market, IDL, NetCDF, TXT, CSV i format binarny.

Weźmy jeden format pliku Python Przykład SciPy, które są regularnie używane w MatLabie:

 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']

Wyjście:

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

Objaśnienie kodu

  • Linia 1 i 2: Zaimportuj niezbędną bibliotekę SciPy do formatu Python z pakietem I/O i Numpy.
  • linia 3: Utwórz tablicę wymiarową 4 x 4
  • linia 4: Zapisz tablicę w przykład.mat plik.
  • Linia 5: Pobierz dane z przykład.mat filet
  • linia 6: Wydruk.

Pakiet funkcji specjalnych

  • scipy.special pakiet zawiera liczne funkcje fizyki matematycznej.
  • Specjalna funkcja SciPy obejmuje pierwiastek sześcienny, wykładniczy, sumę logarytmiczną wykładniczą, Lamberta, permutację i kombinacje, gamma, Bessela, hipergeometryczną, Kelvina, beta, cylinder paraboliczny, wykładniczy błąd względny itp.
  • Aby uzyskać opis wszystkich tych funkcji w jednym wierszu, wpisz Python konsola:
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.

Funkcja pierwiastka sześciennego

Funkcja Cubic Root znajduje pierwiastek sześcienny wartości.

Składnia:

scipy.special.cbrt(x)

Przykład:

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

Wyjście: tablica([3., 4.])

Funkcja wykładnicza:

Funkcja wykładnicza oblicza 10**x element po elemencie.

Przykład:

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

Wyjście: [1.e+01 1.e+10]

Permutacje i kombinacje

SciPy zapewnia także funkcjonalność obliczania permutacji i kombinacji.

Kombinacje – scipy.special.comb(R,k)

Przykład:

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)

Wyjście: 15.0

Permutacje –

scipy.special.perm(N,k)

Przykład:

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

Wyjście: 20

Funkcja wykładnicza log sumy

Log Sum Exponential oblicza log sumy wykładniczej elementu wejściowego.

Składnia :

scipy.special.logsumexp(x) 

Funkcja Bessela

Funkcja obliczania N-tego rzędu liczb całkowitych

Składnia :

scipy.special.jn()

Algebra liniowa z SciPy

  • Algebra liniowa SciPy jest implementacją bibliotek BLAS i ATLAS LAPACK.
  • Wydajność algebry liniowej jest bardzo szybka w porównaniu do BLAS i LAPACK.
  • Procedura algebry liniowej akceptuje dwuwymiarowy obiekt tablicowy, a wynikiem jest również tablica dwuwymiarowa.

Teraz przeprowadźmy test z scipy.linalg,

Obliczenie wyznacznik dwuwymiarowej macierzy,

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 )

Wyjście: -7.0

Odwrotna macierz –

scipy.linalg.inv()

Odwrotna macierz Scipy oblicza odwrotność dowolnej macierzy kwadratowej.

Zobaczmy,

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 )

Wyjście:

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

Wartości własne i wektor własny

scipy.linalg.eig()

  • Najczęstszym problemem algebry liniowej są wartości własne i wektory własne, które można łatwo rozwiązać za pomocą eig()funkcja.
  • Teraz znajdźmy wartość własną (X) i odpowiadają wektorowi własnemu dwuwymiarowej macierzy kwadratowej.

Przykład

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)

Wyjście:

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

Dyskretna transformata Fouriera – scipy.fftpack

  • DFT to technika matematyczna stosowana do przekształcania danych przestrzennych na dane częstotliwościowe.
  • FFT (szybka transformacja Fouriera) to algorytm obliczania DFT
  • FFT jest stosowana do tablicy wielowymiarowej.
  • Częstotliwość określa liczbę sygnałów lub długości fali w danym okresie czasu.

Przykład: Zrób falę i pokaż, używając biblioteki Matplotlib. bierzemy prosty przykład funkcji okresowej 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()

Wyjście:

Dyskretna transformata Fouriera

Możesz to zobaczyć. Częstotliwość wynosi 5 Hz, a jej sygnał powtarza się co 1/5 sekundy – jest to wywołanie określonego okresu czasu.

Teraz wykorzystajmy tę falę sinusoidalną za pomocą aplikacji 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()

Wyjście:

Dyskretna transformata Fouriera

  • Wyraźnie widać, że wynik jest tablicą jednowymiarową.
  • Dane wejściowe zawierające wartości zespolone to zero, z wyjątkiem dwóch punktów.
  • W przykładzie DFT wizualizujemy wielkość sygnału.

Optymalizacja i dopasowanie w SciPy – scipy.optimize

  • Optymalizacja zapewnia użyteczny algorytm minimalizacji dopasowania krzywej, wielowymiarowego lub skalarnego i dopasowania pierwiastkowego.
  • Weźmy przykład funkcja skalarna,znaleźć minimalną funkcję skalarną.
%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) 

Wyjście:

Optymalizacja i dopasowanie w SciPy

Optymalizacja zakończyła się pomyślnie.

Aktualna wartość funkcji: -23.241676

Iteracje: 4

Oceny funkcji: 18

Oceny gradientowe: 6

tablica([-1.67096375])

  • W tym przykładzie optymalizacja odbywa się za pomocą algorytmu gradientowego opadania od punktu początkowego
  • Ale możliwym problemem są minima lokalne zamiast minimów globalnych. Jeśli nie znajdziemy sąsiada minimów globalnych, musimy zastosować optymalizację globalną i znaleźć funkcję minimów globalnych użytą jako skakanie do basenu() który łączy lokalny optymalizator.

optymalizacji.basinhopping(funkcja, 0)

Wyjście:

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 – Algorytm Miodów:

  • Algorytm Neldera-Meada wybiera parametr metody.
  • Zapewnia najprostszy sposób minimalizacji dla funkcji o prawidłowym zachowaniu.
  • Algorytm Neldera – Meada nie jest używany do oceny gradientu, ponieważ znalezienie rozwiązania może zająć więcej czasu.
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")

Wyjście:

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])

Przetwarzanie obrazu za pomocą SciPy – scipy.ndimage

  • scipy.ndimage to podmoduł SciPy, który jest używany głównie do wykonywania operacji związanych z obrazami
  • ndimage oznacza obraz „n” wymiarowy.
  • SciPy Image Processing zapewnia transformację geometrii (obracanie, przycinanie, odwracanie), filtrowanie obrazu (ostrość i usuwanie), wyświetlanie obrazu, segmentację obrazu, klasyfikację i ekstrakcję cech.
  • Pakiet RÓŻNY w SciPy zawiera gotowe obrazy, które można wykorzystać do wykonania zadania manipulacji obrazami

Przykład: Weźmy przykład transformacji geometrycznej obrazów

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()

Wyjście:

Przetwarzanie obrazu za pomocą SciPy

Teraz my Opuść się aktualne zdjęcie:

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

Wyjście:

Przetwarzanie obrazu za pomocą SciPy

Przykład: Obrót obrazu za pomocą 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()

Wyjście:

Przetwarzanie obrazu za pomocą SciPy

Integracja z Scipy – Integracja Numeryczna

  • Kiedy integrujemy jakąkolwiek funkcję, gdzie integracja analityczna nie jest możliwa, musimy zwrócić się w stronę integracji numerycznej
  • SciPy zapewnia funkcjonalność umożliwiającą integrację funkcji z integracją numeryczną.
  • scipy.integrate biblioteka zawiera całkowanie pojedyncze, podwójne, potrójne, wielokrotne, kwadratowe Gaussa, Romberga, trapezowe i Simpsona.

Przykład: A teraz weź przykład Pojedyncza integracja

Integracja z Scipy

Tutaj a jest górną granicą i b jest dolną granicą

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)

Wyjście:

(0.33333333333333337, 3.700743415417189e-15)

Tutaj funkcja zwraca dwie wartości, gdzie pierwsza wartość to całkowanie, a druga wartość to szacowany błąd całki.

Przykład: Teraz weźmy przykład SciPy podwójna całkowanie. Znajdujemy podwójną całkę następującego równania:

Integracja z 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)

Wyjście:

(3.0, 9.657432734515774e-14)

Widziałeś powyższy wynik jako ten sam poprzedni.

Podsumowanie

  • SciPy (wymawiane jako „Sigh Pi”) jest oprogramowaniem typu open source Python- biblioteka, która jest używana w matematyce, obliczeniach naukowych, inżynierii i obliczeniach technicznych.
  • SciPy zawiera różne podpakiety, które pomagają rozwiązać najczęstszy problem związany z obliczeniami naukowymi.
  • SciPy jest wbudowany w NumPy
Nazwa Pakietu Opisy Konstrukcyjne
scipy.io Wejście/wyjście pliku
scipy.special Funkcje specjalne
scipy.linalg Algebra liniowa Operacja
scipy.interpolacja Interpolacja
scipy.optymalizacja Optymalizacja i dopasowanie
scipy.stats Statystyki i liczby losowe
scipy.integrate Całkowanie numeryczne
scipy.fftpack Szybkie transformaty Fouriera
scipy.sygnał Signal Przetwarzanie
scipy.ndimage Manipulacja obrazem –