Учебники

52) Python SciPy

Что такое SciPy?

SciPy — это библиотека на основе Python с открытым исходным кодом, которая используется в математике, научных вычислениях, технике и технических вычислениях.

SciPy также произносится как «Вздох Пи».

Подпакеты SciPy:

В этом уроке вы узнаете:

Зачем использовать SciPy

  • SciPy содержит множество подпакетов, которые помогают решить наиболее распространенную проблему, связанную с научными вычислениями.
  • SciPy является наиболее используемой научной библиотекой, уступающей только научной библиотеке GNU для C / C ++ или Matlab.
  • Простой в использовании и понимании, а также быстрая вычислительная мощность.
  • Он может работать с массивом библиотеки NumPy.

Numpy VS SciPy

Numpy:

  • Numpy написан на C и используется для математических или численных расчетов.
  • Это быстрее, чем другие библиотеки Python
  • Numpy — самая полезная библиотека для Data Science для выполнения базовых вычислений.
  • Numpy не содержит ничего, кроме типа данных массива, который выполняет самые основные операции, такие как сортировка, формирование, индексация и т. Д.

SciPy:

  • SciPy построен на вершине NumPy
  • SciPy — это полнофункциональная версия линейной алгебры, в то время как Numpy содержит только несколько функций.
  • Большинство новых функций Data Science доступно в Scipy, а не в Numpy.

SciPy — Установка и настройка среды

Вы также можете установить SciPy в Windows через pip

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, вам необходимо знать основные функциональные возможности, а также различные типы массивов NumPy.

Стандартный способ импорта модулей infSciPy и Numpy:

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

Пакет ввода / вывода файла:

Scipy, пакет ввода / вывода, обладает широким набором функций для работы с различными форматами файлов: Matlab, Arff, Wave, Matrix Market, IDL, NetCDF, TXT, CSV и двоичным форматом.

Давайте возьмем один пример формата файла, который регулярно использует 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.]])

Код Объяснение

  • Строки 1 и 2: импортируйте необходимую библиотеку scipy с пакетом ввода-вывода и Numpy.
  • Строка 3 : Создать 4 x 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.

Кубическая корневая функция:

Функция Cubic Root находит корень куба значений.

Синтаксис:

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 ** х поэлементно.

Пример:

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

Выход: [1.e + 01 1.e + 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 Exponential вычисляет логарифм суммы экспоненциального входного элемента.

Синтаксис:

scipy.special.logsumexp(x) 

Функция Бесселя

Функция вычисления N-го целого порядка

Синтаксис:

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

Обратная матрица Сципи вычисляет обратную матрицу.

Посмотрим,

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

  • Наиболее распространенная проблема в линейной алгебре — это собственные значения и собственный вектор, которые легко решаются с помощью функции 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 — это математический метод, который используется для преобразования пространственных данных в частотные данные.
  • БПФ (быстрое преобразование Фурье) представляет собой алгоритм для вычисления ДПФ
  • БПФ применяется к многомерному массиву.
  • Частота определяет количество сигнала или длину волны в конкретный период времени.

Пример: возьмите волну и покажите, используя библиотеку 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) 

Вывод:

Оптимизация успешно завершена.

Текущее значение функции: -23.241676

Итерации: 4

Оценка функций: 18

Оценка градиента: 6

Массив ([- 1,67096375])

  • В этом примере оптимизация выполняется с помощью алгоритма градиентного спуска с начальной точки.
  • Но возможная проблема — локальные минимумы вместо глобальных минимумов. Если мы не найдем соседа глобальных минимумов, то нам нужно применить глобальную оптимизацию и найти функцию глобальных минимумов, используемую в качестве bashopping (), которая объединяет локальный оптимизатор.

optimize.basinhopping (функция, 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])

Алгоритм Нелдера-Мида:

  • Алгоритм Нелдера-Мида выбирает через параметр метода.
  • Это обеспечивает наиболее простой способ минимизации справедливого поведения.
  • Алгоритм Нелдера — Мида не используется для оценки градиента, потому что может потребоваться больше времени, чтобы найти решение.
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 Image Processing обеспечивает преобразование геометрии (поворот, обрезка, отражение), фильтрацию изображения (резкое и четкое), отображение изображения, сегментацию изображения, классификацию и извлечение признаков.
  • Пакет 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()

Вывод:

Теперь мы перевернем текущее изображение:

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

Вывод:

Пример : вращение изображения с использованием 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.integrate имеет правила одинарной, двойной, тройной, кратной, квадрата Гаусса, правила Ромберга, Трапеции и Симпсона.

Пример: теперь возьмем пример единой интеграции

Здесь а верхний предел и б нижний предел

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)

Здесь функция возвращает два значения, в которых первое значение является интегрированием, а второе — оцененной ошибкой в ​​интеграле.

Пример: теперь возьмем пример двойной интеграции. Мы находим двойное интегрирование следующего уравнения,

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 (произносится как «Sigh Pi») — это библиотека на основе Python с открытым исходным кодом, которая используется в математике, научных вычислениях, технике и технических вычислениях.
  • SciPy содержит множество подпакетов, которые помогают решить наиболее распространенную проблему, связанную с научными вычислениями.
  • SciPy построен на вершине NumPy
Имя пакета Описание
scipy.io
  • Ввод / вывод файла
scipy.special
  • Специальная функция
scipy.linalg
  • Операция по линейной алгебре
scipy.interpolate
  • интерполирование
scipy.optimize
  • Оптимизация и подгонка
scipy.stats
  • Статистика и случайные числа
scipy.integrate
  • Численная интеграция
scipy.fftpack
  • Быстрые преобразования Фурье
scipy.signal
  • Обработка сигнала
scipy.ndimage
  • Манипулирование изображениями —