SciPy — интегрирование и дифференцирование, обработка изображений и сигналов

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Думаю, ни для кого не секрет, что Python может все или почти все. Например, для построения графиков можно использовать matplotlib, для анализа и манипуляции данными можно использовать библиотеку pandas, а для работы с массивами была разработана библиотека numpy. А есть ли библиотека, которая может выполнять различные математические операции, например, интегрирование и дифференцирование, обработка изображений и сигналов, расчет статистических распределений и функций? Конечно есть, это библиотека SciPy.

Предлагаю поговорить об этом по подробнее. SciPy (сокращение от Scientific Python, или научный Python) – библиотека, которая является расширением библиотеки NumPy и предназначена для выполнения сложных инженерных, статистических и научных расчетов, а так же для анализа данных и построения графиков.

Чем SCIPY отличается от NUMPY?

Первое отличие – по типу выполняемых операций. NumPy выполняет стандартные операции, такие как сортировка, индексирование, а так же элементарные операции, связанные с типом данных массива. SciPy используется для выполнения сложных операций, например, расчет алгебраических функций или различных числовых алгоритмов.

Второе отличие – методы и функции, которые содержатся в библиотеках. NumPy содержит немалое количество функций и методов для решения задач линейной алгебры, а также расчета преобразования Фурье и обработки сигналов и изображений, однако они неполноценные. В SciPy, наоборот, эти функции и методы реализованы в полном объеме, и их гораздо больше.

Третье отличие – концепция массивов. Массивы из библиотеки NumPy — это многомерные массивы объектов, которые имеют одинаковый тип, то есть они однородны или гомогенны. В SciPy концепция массивов немного другая, поскольку она более функциональна, и не имеет ограничений на однородность. То есть массивы SciPy могут быть как гомогенными, так и гетерогенными.

Четвертое отличие – язык, написания библиотек и скорость.

Библиотека NumPy написана на языке C и как следствие имеет более высокую скорость вычислений, однако за нее приходится платить функциональностью библиотеки. Библиотека SciPy написана на языке Python и поэтому имеет более низкую скорость выполнения, однако низкая скорость компенсируется предоставляемой функциональностью.

Каковы возможности библиотеки SCIPY?

Возможности библиотеки определятся, функциями и методами, которые в ней реализованы. Сама библиотека SciPy, состоит из нескольких модулей, реализованных для решения определенного типа задач, например, linalg – модуль, содержащий методы линейной алгебры, или optimize, который реализует инструменты оптимизации. Состав библиотеки SciPy можно получить при помощи выполнения следующего кода.

import scipy
help(scipy)

Перейдем от слов к делу и посмотрим код.

Предлагаю в качестве демонстрации возможностей библиотеки посмотреть работу некоторых пакетов.

Integrate.

Данный пакет, позволяет проводить численное интегрирование: рассчитывать определенные интегралы, решать обыкновенные дифференциальные уравнения и пр.

# подключим пакет интегрирования из библиотеки scipy
from scipy import integrate
# опишем подынтегральную функцию
def target_function_f(x):
 return 2.0 * x ** 2
# выполним интегрирование
result = integrate.quad(target_function_f, 0.0, 4.0)
# посмотрим результат
print(result)

(42.66666666666667, 4.736951571734002e-13)

Отмечу, что в пакете integrate помимо функции quad(), которая возвращает кортеж из двух элементов, первый — значение интеграла, второй — точность вычисления, реализованы другие методы нахождения интегралов. Вот некоторые из них: trapz() (метод трапеций), sims() (метод Симпсона), romb() (метод Ромберга) и т.д.

Io.

Данный пакет предоставляет функции для работы и управления файлами самых разных форматов, включая MATLAB, файлы IDL, Matrix Market, Fortran, и даже WAV. Ниже рассмотрим кусок кода, который покажет каким образом можно добавить данные из файла формата MATLAB.

# импортируем пакет io из библиотеки scipy
from scipy import io as spio
import numpy as np
# создадим массив, который запишем в MATLAB файл;
x = np.ones((3,3))
# покажем только что созданный массив;
print('Array from Python')
print(x)
# запишем массив в MATLAB файл;
spio.savemat('f.mat', {'a':x})
# загрузим массив из MATLAB файла;
data = spio.loadmat('f.mat',struct_as_record=True)
# покажем только что загруженный массив;
print('Array from Matlab File')
print(data['a'])

Stats.

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

В основе проверки на "нормальность" лежит проверка гипотез. Для проверки будем использовать две гипотезы. Истинная гипотеза говорит о нормальном распределении данных, а ложная подтверждает отсутствие нормального распределения.

Для проведения проверки будем использовать критерией Шапиро-Уилка. В результате проверки мы получим значение вычисленной статистики и p-значение. Для определения принадлежности результата к гипотезе, будем использовать критический параметр альфа со значением 0,05. В случае, если p-значение будет меньше 0,05, можно утверждать, что гипотеза ложная и данные не имею нормального распределения, иначе данные распределены нормально.

Для проверки будем использовать набор данных с информацией о продаже видеоигр по всему миру с сайта Kaggle по ссылке: https://www.kaggle.com/datasets/gregorut/videogamesales?resource=download. Проверяемым атрибута выберем EU_Sales (продажи в Европе):

import pandas as pd
# загрузим набор данных
data = pd.read_csv('vgsales.csv')
# просмотрим несколько строк из набора данных
data.head()
# выведем некоторые статистики
data.describe()
import scipy as sc
# запустим тест Шапиро-Уилка
statistics, p_Value = sc.stats.shapiro(data['EU_Sales'])
# выведем результаты теста Шапиро-Уилка
print('Stats=%.3f, pValue=%.3f' % (statistics, p_Value))
alpha = 0.05
#Выведем результаты о принятии или отклонении гипотезы о нормальности
if p_Value > alpha:
 print('Данные распределены нормально')
else:
 print('Данные не имеют нормального распределения')

Stats=0.256, pValue=0.000

Данные не имеют нормального распределения

В заключении

В заключение хочется сказать, что представленная информация в данной статье составляет лишь малую верхушку айсберга от общего объема информации. В данной статье мы рассмотрели, основные моменты связанные с библиотекой SciPy, рассмотрели возможности некоторых модулей. Более подробную и детальную информацию о данной библиотеке можно найти на официальном сайте документации, по ссылке: https://scipy.org/.

Источник: https://habr.com/ru/post/701016/


Интересные статьи

Интересные статьи

Обработка исключений в Java в функциональном стиле. Часть 2. В предыдущей статье была рассмотрена функциональная обработка исключений с помощью интерфейса Try<T>. Статья вызвала определенный ин...
Как уменьшить трафик к вашему сайту в 200 раз? Возможно ли это? В этой статье рассмотрено динамическое создание превьюшек для графических файлов и последующее сохранение результатов такого преобразова...
Всем привет. Текст состоит из двух частей:1. Небольшая шпаргалка по параметрам настроек по умолчанию;2. Текст о том, почему вообще существование такой шпаргалки может кому-то понадобится.
Cтатья будет полезна тем, кто думает какую выбрать CMS для интернет-магазина, сравнивает различные движки, ищет в них плюсы и минусы важные для себя.
В Челябинске проходят митапы системных администраторов Sysadminka, и на последнем из них я делал доклад о нашем решении для работы приложений на 1С-Битрикс в Kubernetes. Битрикс, Kubernetes, Сep...