SciPy в Python: исчерпывающее руководство по библиотекам и функциям
SciPy в Python
SciPy — библиотека с открытым исходным кодом, расширяющая NumPy для решения математических, научных, инженерных и технических задач. Построенная на NumPy, SciPy предлагает широкий набор высокоуровневых команд для манипуляции данными и визуализации.
Подпакеты
- scipy.io — ввод-вывод файлов для MATLAB, NetCDF, CSV и многих других форматов
- scipy.special — специальные математические функции (Бесселя, Гамма и др.)
- scipy.linalg — подпрограммы линейной алгебры
- scipy.interpolate — методы интерполяции
- scipy.optimize — оптимизация и подгонка кривых
- scipy.stats — статистические распределения и генерация случайных чисел
- scipy.integrate — численное интегрирование
- scipy.fftpack — быстрые преобразования Фурье
- scipy.signal — обработка сигналов
- scipy.ndimage — многомерная обработка изображений
Это руководство охватывает:
- Что такое SciPy и почему это важно
- Различия между NumPy и SciPy
- Установка и настройка окружения
- Ключевые подпакеты с примерами кода
- Практические приложения: линейная алгебра, преобразования Фурье, оптимизация, обработка изображений, численное интегрирование
Зачем использовать SciPy?
- Комплексный набор научных инструментов, вторым по мощности только библиотекам вроде GNU Scientific Library и MATLAB
- Прост в использовании, быстр и полностью совместим с массивами NumPy
- Широко принят в академической среде и индустрии, обеспечивая надежную поддержку и вклад сообщества
NumPy против SciPy
NumPy
- Основная библиотека для высокопроизводительных числовых вычислений в Python, написанная на C
- Предоставляет объекты массивов и базовые операции (сортировка, изменение формы, индексация)
- Фундамент для всех научных библиотек в Python
SciPy
- Построена на NumPy, расширяя её специализированными алгоритмами
- Включает полные наборы линейной алгебры, оптимизации, статистики и многого другого
- Необходима для продвинутых научных рабочих процессов
Установка и настройка окружения
Установите SciPy с pip или системными менеджерами пакетов:
Python3 -m pip install --user numpy scipy
sudo apt-get install python-scipy python-numpy
sudo port install py35-scipy py35-numpy
Импорт SciPy и NumPy в скриптах:
from scipy import special import numpy as np
Ввод-вывод файлов с scipy.io
Легко сохраняйте и загружайте MATLAB .mat файлы:
import numpy as np
from scipy import io as sio
array = np.ones((4, 4))
sio.savemat('example.mat', {'ar': array})
loaded = sio.loadmat('example.mat', struct_as_record=True)
print(loaded['ar'])
Вывод:
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
Специальные функции — scipy.special
Примеры часто используемых специальных функций:
- Кубический корень:
scipy.special.cbrt(x)→cbrt([27, 64]) # [3., 4.] - 10x:
scipy.special.exp10(x)→exp10([1,10]) # [1.e+01 1.e+10] - Сочетания:
scipy.special.comb(N, k, exact=False, repetition=True)→comb(5, 2) # 15.0 - Перестановки:
scipy.special.perm(N, k, exact=True)→perm(5, 2) # 20 - LogSumExp:
scipy.special.logsumexp(x) - Функция Бесселя J:
scipy.special.jn(n, x)
Линейная алгебра — scipy.linalg
Вычисление определителя, обратной матрицы, собственных значений и векторов:
from scipy import linalg import numpy as np A = np.array([[4,5],[3,2]]) print(linalg.det(A)) # -7.0 print(linalg.inv(A)) # обратная матрица vals, vecs = linalg.eig(A) print(vals) print(vecs)
Вывод:
-7.0
array([[-0.28571429, 0.71428571],
[ 0.42857143, -0.57142857]])
[ 9.+0.j -1.+0.j]
[[ 0.70710678 -0.5547002 ]
[ 0.70710678 0.83205029]]
Дискретное преобразование Фурье — scipy.fftpack
Преобразование синусоиды и визуализация её спектра:
%matplotlib inline
from matplotlib import pyplot as plt
import numpy as np
from scipy import fftpack
freq = 5
sample_rate = 50
t = np.linspace(0, 2, 2 * sample_rate, endpoint=False)
wave = np.sin(freq * 2 * np.pi * t)
plt.plot(t, wave)
plt.xlabel('Time (s)'); plt.ylabel('Amplitude')
plt.show()
A = fftpack.fft(wave)
frequency = fftpack.fftfreq(len(wave)) * sample_rate
plt.stem(frequency, np.abs(A))
plt.xlabel('Frequency (Hz)')
plt.ylabel('Magnitude')
plt.xlim(-sample_rate/2, sample_rate/2)
plt.ylim(0, 110)
plt.show()
Оптимизация — scipy.optimize
Поиск минимума скалярной функции с BFGS и глобального поиска с basin-hopping:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize
def func(a):
return a*2 + 20*np.sin(a)
plt.plot(np.linspace(-10, 10, 400), func(np.linspace(-10, 10, 400)))
plt.show()
min_bfgs = optimize.fmin_bfgs(func, 0)
print('BFGS result:', min_bfgs)
min_basin = optimize.basinhopping(func, 0)
print('Basin‑hopping result:', min_basin.x)
Вывод показывает локальный минимум, найденный BFGS, и глобальный оптимум, подтверждённый basin-hopping.
Алгоритм Nelder-Mead
Простая безусловная минимизация без информации о градиенте:
from scipy.optimize import minimize
def f(x):
return 0.4*(1 - x[0])**2
res = minimize(f, [2, -1], method='Nelder-Mead')
print('Result:', res.x, 'Function value:', res.fun)
Обработка изображений — scipy.ndimage
Манипуляция изображениями: отображение, отражение, поворот, применение фильтров.
from scipy import ndimage, misc
from matplotlib import pyplot as plt
panda = misc.face()
plt.imshow(panda)
plt.title('Original')
plt.show()
flip_down = np.flipud(panda)
plt.imshow(flip_down)
plt.title('Flip Down')
plt.show()
rotated = ndimage.rotate(panda, 135)
plt.imshow(rotated)
plt.title('Rotated 135°')
plt.show()
Численное интегрирование — scipy.integrate
Одинарные и двойные интегралы с автоматической оценкой ошибки:
from scipy import integrate
# Одинарный интеграл x^2 от 0 до 1
single = integrate.quad(lambda x: x**2, 0, 1)
print('Single integral:', single)
# Двойной интеграл 64*x*y над треугольной областью
double = integrate.dblquad(lambda x, y: 64*x*y, 0, 2/4,
lambda x: 0, lambda y: (1 - 2*y**2)**0.5)
print('Double integral:', double)
Оба возвращают кортеж: (значение, оценка ошибки).
Резюме
SciPy расширяет NumPy, предоставляя полный стек научных вычислений, включая линейную алгебру, оптимизацию, статистику, обработку сигналов и манипуляцию изображениями. Её обширные подпакеты и надёжная поддержка сообщества делают её незаменимой для исследователей и инженеров.
| Имя пакета | Описание |
|---|---|
| scipy.io | Ввод-вывод файлов для MATLAB, CSV, NetCDF и др. |
| scipy.special | Специальные математические функции (Бессель, Гамма и др.) |
| scipy.linalg | Продвинутые подпрограммы линейной алгебры |
| scipy.interpolate | Методы интерполяции |
| scipy.optimize | Инструменты оптимизации и подгонки кривых |
| scipy.stats | Статистические распределения и генерация случайных чисел |
| scipy.integrate | Численное интегрирование (quad, dblquad и др.) |
| scipy.fftpack | Быстрые преобразования Фурье |
| scipy.signal | Утилиты обработки сигналов |
| scipy.ndimage | Многомерная обработка изображений |
Python
- Функция print() в Python: практическое руководство с примерами
- Мастерство метода str.count() в Python: как подсчитывать символы и подстроки с примерами
- Мастерство строк форматирования format() в Python: понятные примеры
- Освоение лямбда-функций Python: практические примеры и лучшие практики
- Функция abs() в Python: вычисление абсолютных значений для чисел и комплексных чисел
- Функция round() в Python: подробное объяснение с практическими примерами
- Освоение функции map() в Python: синтаксис, примеры и лучшие практики
- Python timeit(): измерение времени выполнения с практическими примерами
- Освоение yield в Python: генератор против return — практическое руководство
- Понимание type() и isinstance() в Python: практические примеры