math ⚡️ Python 3 с примерами кода
Модуль math
– один из наиважнейших в Python. Этот модуль предоставляет обширный функционал для работы с числами.
math.ceil(X)
- округление до ближайшего большего числа.
math.copysign(X, Y)
- возвращает число, имеющее модуль такой же, как и у числа
X
, а знак — как у числаY
. math.fabs(X)
- модуль
X
. math.factorial(X)
- факториал числа
X
. math.floor(X)
- округление вниз.
math.fmod(X, Y)
- остаток от деления
X
наY
. math.frexp(X)
- возвращает мантиссу и экспоненту числа.
math.ldexp(X, I)
X * 2i
. Функция, обратная функцииmath.frexp()
.math.fsum(последовательность)
- сумма всех членов последовательности.
sum()
, ноmath.fsum()
более точна для чисел с плавающей точкой. math.isfinite(X)
- является ли
X
числом. math.isinf(X)
- является ли
X
бесконечностью. math.isnan(X)
- является ли
X
NaN (Not a Number — не число). math.modf(X)
- возвращает дробную и целую часть числа
X
. Оба числа имеют тот же знак, что иX
. math.trunc(X)
- усекает значение
X
до целого. math.exp(X)
eX
.math.expm1(X)
eX - 1
. ПриX → 0
точнее, чемmath.exp(X)-1
.math.log(X, [base])
- логарифм
X
по основаниюbase
. Еслиbase
не указан, вычисляется натуральный логарифм. math.log1p(X)
- натуральный логарифм
(1 + X)
. ПриX → 0
точнее, чемmath.log(1+X)
. math.log10(X)
- логарифм
X
по основанию10
. math.log2(X)
- логарифм
X
по основанию2
. Новое в Python 3.3. math.pow(X, Y)
XY
.math.sqrt(X)
- квадратный корень из
X
. math.acos(X)
- арккосинус
X
. В радианах. math.asin(X)
- арксинус
X
. В радианах. math.atan(X)
- арктангенс
X
. В радианах. math.atan2(Y, X)
- арктангенс
. В радианах. С учетом четверти, в которой находится точка(X, Y)
. math.cos(X)
- косинус
X
(X
указывается в радианах). math.sin(X)
- синус
X
(X
указывается в радианах). math.tan(X)
- тангенс
X
(X
указывается в радианах). math.hypot(X, Y)
- вычисляет гипотенузу треугольника с катетами
X
иY
(math.sqrt(x * x + y * y)
). math.degrees(X)
- конвертирует радианы в градусы.
math.radians(X)
- конвертирует градусы в радианы.
math.cosh(X)
- вычисляет гиперболический косинус.
math.sinh(X)
- вычисляет гиперболический синус.
math.tanh(X)
- вычисляет гиперболический тангенс.
math.acosh(X)
- вычисляет обратный гиперболический косинус.
math.asinh(X)
- вычисляет обратный гиперболический синус.
math.atanh(X)
- вычисляет обратный гиперболический тангенс.
math.erf(X)
- функция ошибок.
math.erfc(X)
- дополнительная функция ошибок (
1 - math.erf(X)
). math.gamma(X)
- гамма-функция
X
. math.lgamma(X)
- натуральный логарифм гамма-функции
X
. math.pi
- pi = 3,1415926…
math.e
- e = 2,718281…
Комплексная функция, отображение областей : Анализ-II
Сообщения без ответов | Активные темы | Избранное
Правила форума
В этом разделе нельзя создавать новые темы.
Если Вы хотите задать новый вопрос, то не дописывайте его в существующую тему, а создайте новую в корневом разделе «Помогите решить/разобраться (М)».
Если Вы зададите новый вопрос в существующей теме, то в случае нарушения оформления или других правил форума Ваше сообщение и все ответы на него могут быть удалены без предупреждения.
Не ищите на этом форуме халяву, правила запрещают участникам публиковать готовые решения стандартных учебных задач. Автор вопроса обязан привести свои попытки решения и указать конкретные затруднения.
Обязательно просмотрите тему Правила данного раздела, иначе Ваша тема может быть удалена или перемещена в Карантин, а Вы так и не узнаете, почему.
Dilettante |
| ||
29/05/10 |
| ||
| |||
maxmatem |
| ||
15/08/09 |
| ||
| |||
Joker_vD |
| |||
09/09/10 |
| |||
| ||||
Виктор Викторов |
| |||
04/04/09 |
| |||
| ||||
maxmatem |
| ||
15/08/09 |
| ||
| |||
Виктор Викторов |
| |||
04/04/09 |
| |||
| ||||
paha |
| |||
03/02/10 |
| |||
| ||||
Виктор Викторов |
| |||
04/04/09 |
| |||
| ||||
Joker_vD |
| |||
09/09/10 |
| |||
| ||||
Виктор Викторов |
| |||
04/04/09 |
| |||
| ||||
Joker_vD |
| |||
09/09/10 |
| |||
| ||||
MetaMorphy |
| ||
23/10/10 |
| ||
| |||
Dilettante |
| ||
29/05/10 |
| ||
| |||
Виктор Викторов |
| |||
04/04/09 |
| |||
| ||||
paha |
| |||
03/02/10 |
| |||
| ||||
Показать сообщения за: Все сообщения1 день7 дней2 недели1 месяц3 месяца6 месяцев1 год Поле сортировки АвторВремя размещенияЗаголовокпо возрастаниюпо убыванию |
Страница 1 из 1 | [ Сообщений: 15 ] |
Модераторы: Модераторы Математики, Супермодераторы
Кто сейчас на конференции |
Сейчас этот форум просматривают: нет зарегистрированных пользователей |
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения |
Найти: |
1 | Найти точное значение | грех(30) | |
2 | Найти точное значение | грех(45) | |
3 | Найти точное значение | грех(30 градусов) | |
4 | Найти точное значение | грех(60 градусов) | |
5 | Найти точное значение | загар (30 градусов) | |
6 | Найти точное значение | угловой синус(-1) | |
7 | Найти точное значение | грех(пи/6) | |
8 | Найти точное значение | cos(pi/4) | |
9 | Найти точное значение | грех(45 градусов) | |
10 | Найти точное значение | грех(пи/3) | |
11 | Найти точное значение | арктан(-1) | |
12 | Найти точное значение | cos(45 градусов) | |
13 | Найти точное значение | cos(30 градусов) | |
14 | Найти точное значение | желтовато-коричневый(60) | |
15 | Найти точное значение | csc(45 градусов) | |
16 | Найти точное значение | загар (60 градусов) | |
17 | Найти точное значение | сек(30 градусов) | |
18 | Найти точное значение | cos(60 градусов) | |
19 | Найти точное значение | cos(150) | |
20 | Найти точное значение | грех(60) | |
21 | Найти точное значение | cos(pi/2) | |
22 | Найти точное значение | загар (45 градусов) | |
23 | Найти точное значение | arctan(- квадратный корень из 3) | |
24 | Найти точное значение | csc(60 градусов) | |
25 | Найти точное значение | сек(45 градусов) | |
26 | Найти точное значение | csc(30 градусов) | |
27 | Найти точное значение | грех(0) | |
28 | Найти точное значение | грех(120) | |
29 | Найти точное значение | соз(90) | |
30 | Преобразовать из радианов в градусы | пи/3 | |
31 | Найти точное значение | желтовато-коричневый(30) | |
32 | 92|||
35 | Преобразовать из радианов в градусы | пи/6 | |
36 | Найти точное значение | детская кроватка(30 градусов) | |
37 | Найти точное значение | арккос(-1) | |
38 | Найти точное значение | арктан(0) | |
39 | Найти точное значение | детская кроватка(60 градусов) | |
40 | Преобразование градусов в радианы | 30 | |
41 | Преобразовать из радианов в градусы | (2 шт. )/3 | |
42 | Найти точное значение | sin((5pi)/3) | |
43 | Найти точное значение | sin((3pi)/4) | |
44 | Найти точное значение | тан(пи/2) | |
45 | Найти точное значение | грех(300) | |
46 | Найти точное значение | соз(30) | |
47 | Найти точное значение | соз(60) | |
48 | Найти точное значение | соз(0) | |
49 | Найти точное значение | соз(135) | |
50 | Найти точное значение | cos((5pi)/3) | |
51 | Найти точное значение | cos(210) | |
52 | Найти точное значение | сек(60 градусов) | |
53 | Найти точное значение | грех(300 градусов) | |
54 | Преобразование градусов в радианы | 135 | |
55 | Преобразование градусов в радианы | 150 | |
56 | Преобразовать из радианов в градусы | (5 дюймов)/6 | |
57 | Преобразовать из радианов в градусы | (5 дюймов)/3 | |
58 | Преобразование градусов в радианы | 89 градусов | |
59 | Преобразование градусов в радианы | 60 | |
60 | Найти точное значение | грех(135 градусов) | |
61 | Найти точное значение | грех(150) | |
62 | Найти точное значение | грех(240 градусов) | |
63 | Найти точное значение | детская кроватка(45 градусов) | |
64 | Преобразовать из радианов в градусы | (5 дюймов)/4 | |
65 | Найти точное значение | грех(225) | |
66 | Найти точное значение | грех(240) | |
67 | Найти точное значение | cos(150 градусов) | |
68 | Найти точное значение | желтовато-коричневый(45) | |
69 | Оценить | грех(30 градусов) | |
70 | Найти точное значение | сек(0) | |
71 | Найти точное значение | cos((5pi)/6) | |
72 | Найти точное значение | КСК(30) | |
73 | Найти точное значение | arcsin(( квадратный корень из 2)/2) | |
74 | Найти точное значение | загар((5pi)/3) | |
75 | Найти точное значение | желтовато-коричневый(0) | |
76 | Оценить | грех(60 градусов) | |
77 | Найти точное значение | arctan(-( квадратный корень из 3)/3) | |
78 | Преобразовать из радианов в градусы | (3 пи)/4 | |
79 | Найти точное значение | sin((7pi)/4) | |
80 | Найти точное значение | угловой синус(-1/2) | |
81 | Найти точное значение | sin((4pi)/3) | |
82 | Найти точное значение | КСК(45) | |
83 | Упростить | арктан(квадратный корень из 3) | |
84 | Найти точное значение | грех(135) | |
85 | Найти точное значение | грех(105) | |
86 | Найти точное значение | грех(150 градусов) | |
87 | Найти точное значение | sin((2pi)/3) | |
88 | Найти точное значение | загар((2pi)/3) | |
89 | Преобразовать из радианов в градусы | пи/4 | |
90 | Найти точное значение | грех(пи/2) | |
91 | Найти точное значение | сек(45) | |
92 | Найти точное значение | cos((5pi)/4) | |
93 | Найти точное значение | cos((7pi)/6) | |
94 | Найти точное значение | угловой синус(0) | |
95 | Найти точное значение | грех(120 градусов) | |
96 | Найти точное значение | желтовато-коричневый ((7pi)/6) | |
97 | Найти точное значение | соз(270) | |
98 | Найти точное значение | sin((7pi)/6) | |
99 | Найти точное значение | arcsin(-( квадратный корень из 2)/2) | |
100 | Преобразование градусов в радианы | 88 градусов |
Lambdify — Документация по SymPy 1.
11Этот модуль предоставляет удобные функции для преобразования выражений SymPy в лямбда-функции, которые можно использовать для очень быстрого вычисления числовых значений.
- sympy.utilities.lambdify.implemented_function( symfunc , реализация )[источник]
Добавить числовую реализацию
symfunc
.symfunc
может быть экземпляромUndefinedFunction
или строкой имени. В последнем случае мы создаемUndefinedFunction
экземпляр с этим имя.Имейте в виду, что это быстрый обходной путь, а не общий метод создания специальные символические функции. Если вы хотите создать символическую функцию, которая будет используется всеми механизмами SymPy, вы должны подклассифицировать функцию
- Параметры:
symfunc :
str
илиUndefinedFunction
экземплярЕсли
str
, то создайте новуюUndefinedFunction
с этим как имя. Еслиsymfunc
— неопределенная функция, создайте новую функцию с тем же названием и реализованной функцией.реализация : вызываемый
числовая реализация, вызываемая
evalf()
илиlambdify
- Возвраты:
afunc : экземпляр sympy.FunctionClass
Функция
с прилагаемой реализацией
Примеры
>>> из sympy.abc импортировать x >>> из sympy.utilities.lambdify импортировать реализованную_функцию >>> из sympy импортировать lambdify >>> f = реализованная_функция('f', лямбда x: x+1) >>> lam_f = lambdify(x, f(x)) >>> lam_f(4) 5
- sympy.utilities.lambdify.lambdastr( args , expr , принтер=Нет , dummify=Нет )[источник]
Возвращает строку, которую можно преобразовать в лямбда-функцию.
Примеры
>>> из sympy.abc импортировать x, y, z >>> из sympy.utilities.lambdify импортировать lambdastr >>> лямбдастр(х, х**2) 'лямбда х: (х**2)' >>> lambdastr((x,y,z), [z,y,x]) 'лямбда x,y,z: ([z, y, x])'
Хотя кортежи могут не отображаться в качестве аргументов лямбда-выражения в Python 3, lambdastr создаст лямбда-функцию, которая распаковывает оригинал аргументы, чтобы можно было обрабатывать вложенные аргументы:
>>> lambdastr((x, (y, z)), x + y) 'лямбда _0,_1: (лямбда x,y,z: (x + y))(_0,_1[0],_1[1])'
- sympy.utilities.lambdify.lambdify( аргументы , expr , модули = нет , принтер = нет , use_imps = True , dummify = False , cse = False ) [источник]
Преобразование выражения SymPy в функцию, позволяющую быстро числовая оценка.
Предупреждение
Эта функция использует
exec
и поэтому не должна использоваться на несанкционированный ввод.Устарело, начиная с версии 1.7: передача набора для параметра args устарела, поскольку наборы неупорядоченный. Используйте упорядоченную итерацию, такую как список или кортеж.
- Параметры:
аргументы : Список [Символ]
Переменная или список переменных, вложенность которых представляет вложенность аргументов, которые будут переданы в функцию.
Переменные могут быть символами, неопределенными функциями или матричными символами.
>>> из sympy import Eq >>> из sympy.abc импортировать x, y, z
Список переменных должен соответствовать структуре того, как аргументы будут переданы в функцию. Просто приложите параметры, поскольку они будут переданы в списке.
Для вызова функции типа
f(x)
, затем[x]
должен быть первым аргументомlambdify
; за это случае также можно использовать одинx
:>>> f = lambdify(x, x + 1) >>> ф(1) 2 >>> f = lambdify([x], x + 1) >>> ф(1) 2
Чтобы вызвать функцию типа
f(x, y)
, тогда[x, y]
будет быть первым аргументомlambdify
:>>> f = lambdify([x, y], x + y) >>> f(1, 1) 2
Чтобы вызвать функцию с одним кортежем из трех элементов, например
f((x, y, z))
, тогда[(x, y, z)]
будет первым аргументlambdify
:>>> f = lambdify([(x, y, z)], Eq(z**2, x**2 + y**2)) >>> f((3, 4, 5)) Истинный
Если будут переданы два аргумента и первый является скалярным, но второй — кортеж с двумя аргументами, тогда элементы в списке должна соответствовать этой структуре:
>>> f = lambdify([x, (y, z)], x + y + z) >>> f(1, (2, 3)) 6
выражение : выражение
Выражение, список выражений или матрица для вычисления.
Списки могут быть вложенными. Если выражение представляет собой список, вывод также будет списком.
>>> f = lambdify(x, [x, [x + 1, x + 2]]) >>> ф(1) [1, [2, 3]]
Если это матрица, будет возвращен массив (для модуля NumPy).
>>> из матрицы импорта sympy >>> f = lambdify(x, Matrix([x, x + 1])) >>> ф(1) [[1] [2]]
Обратите внимание, что здесь используется порядок аргументов (переменные, затем выражение) для эмуляции ключевого слова Python
lambda
.lambdify(x, expr)
работает (примерно) какlambda x: expr
(см. Как это работает ниже).модули : стр, дополнительно
Указывает числовую библиотеку для использования.
Если не указано, модули по умолчанию:
["scipy", "numpy"]
, если установлен SciPy["numpy"]
, если установлен только NumPy["math", "mpmath", "sympy"]
, если ни один из них не установлен.
То есть функции SymPy по возможности заменены на либо
scipy
либоnumpy
функций, если они доступны, и Python’s в противном случае стандартная библиотекаmath
илиmpmath
.Модули могут быть одного из следующих типов:
Строки
"math"
,"mpmath"
,"numpy"
,"numexpr"
,"numexpr"
"scipy"
,"sympy"
, или"tensorflow"
или"jax"
. Это использует соответствующий принтер и сопоставление пространства имен для этого модуля.Модуль А (например,
математический
). При этом используется глобальное пространство имен модуль. Если модуль является одним из вышеупомянутых известных модулей, он будет также используйте соответствующий принтер и отображение пространства имен (т. е.modules=numpy
эквивалентноmodules="numpy"
).Словарь, который сопоставляет имена функций SymPy с произвольными функции (например,
{'sin': custom_sin}
).Список, содержащий сочетание приведенных выше аргументов с более высоким приоритет отдается записям, которые появляются первыми (например, чтобы использовать модуль NumPy, но переопределить функцию
sin
с пользовательской версией вы можете использовать[{'sin': custom_sin}, 'numpy']
).
фиктивный : bool, необязательный
Независимо от того, являются ли переменные в предоставленном выражении, которые не действительные идентификаторы Python заменяются фиктивными символами.
Это позволяет использовать неопределенные функции, такие как
Function('f')(t)
. поставляются в качестве аргументов. По умолчанию переменные только фиктивные если они не являются допустимыми идентификаторами Python.Установите
dummify=True
, чтобы заменить все аргументы фиктивными символами (еслиargs
не является строкой) — например, чтобы убедиться, что аргументы не переопределяют никаких встроенных имен.cse : bool или вызываемый, необязательный
Большие выражения могут быть вычислены более эффективно, если общие подвыражения идентифицируются и предварительно вычисляются до используется многократно. Поиск подвыражений сделает Однако создание функции «lambdify» медленнее.
Когда
True
, используетсяsympy.simplify.cse
, иначе (по умолчанию) пользователь может передать функцию, соответствующую подписиcse
.
Пояснение
Например, чтобы преобразовать выражение SymPy
sin(x) + cos(x)
в эквивалентная функция NumPy, которая численно оценивает его:>>> from sympy import sin, cos, symbols, lambdify >>> импортировать numpy как np >>> х = символы('х') >>> выражение = грех(х) + соз(х) >>> выражение грех (х) + потому что (х) >>> f = lambdify(x, expr, 'numpy') >>> а = np. массив ([1, 2]) >>> ф(а) [1.381773290,49315059]
Основная цель этой функции — предоставить мост от SymPy выражения для числовых библиотек, таких как NumPy, SciPy, NumExpr, mpmath, и тензорный поток. Как правило, функции SymPy не работают с объектами из другие библиотеки, такие как массивы NumPy и функции из числовых такие библиотеки, как NumPy или mpmath, не работают с выражениями SymPy.
lambdify
соединяет эти два понятия, преобразуя выражение SymPy в эквивалентная числовая функция.Основной рабочий процесс с
lambdify
заключается в том, чтобы сначала создать выражение SymPy. представляющие любую математическую функцию, которую вы хотите оценить. Этот должно выполняться с использованием только функций и выражений SymPy. Затем используйтеlambdify
, чтобы преобразовать это в эквивалентную функцию для числовых оценка. Например, выше мы создалиexpr
, используя символ SymPy.x
и функции SymPysin
иcos
, а затем преобразовал его в эквивалентная функция NumPyf
и вызвала ее в массиве NumPya
.Примеры
>>> из sympy.utilities.lambdify импортировать реализованную_функцию >>> из sympy импортирует sqrt, sin, Matrix >>> из функции импорта sympy >>> из sympy.abc импортировать w, x, y, z
>>> f = lambdify(x, x**2) >>> f(2) 4 >>> f = lambdify((x, y, z), [z, y, x]) >>> f(1,2,3) [3, 2, 1] >>> f = lambdify(x, sqrt(x)) >>> f(4) 2.0 >>> f = lambdify((x, y), sin(x*y)**2) >>> f(0, 5) 0,0 >>> row = lambdify((x, y), Matrix((x, x + y)).T, modules='sympy') >>> строка (1, 2) Матрица([[1, 3]])
lambdify
можно использовать для перевода выражений SymPy в mpmath функции. Это может быть предпочтительнее использованияevalf
(который использует mpmath на бэкэнд) в некоторых случаях.>>> f = lambdify(x, sin(x), 'mpmath') >>> ф(1) 0,8414709848078965
Аргументы кортежа обработаны, и функция lambdified должна вызываться с тем же типом аргументов, который использовался для создания функция:
>>> f = lambdify((x, (y, z)), x + y) >>> f(1, (2, 4)) 3
Функцию
flatten
можно использовать, чтобы всегда работать со сглаженными аргументы:>>> из импорта sympy. utilities.iterables сгладить >>> args = w, (x, (y, z)) >>> значения = 1, (2, (3, 4)) >>> f = lambdify (сглаживание (аргументы), w + x + y + z) >>> f(*flatten(vals)) 10
Функции, представленные в
expr
, также могут иметь собственные числовые значения. реализации в вызываемом объекте, прикрепленном к атрибуту_imp_
. Этот может использоваться с неопределенными функциями с помощьюреализованной_функции
завод:>>> f = реализованная_функция (функция ('f'), лямбда x: x+1) >>> func = lambdify(x, f(x)) >>> функция(4) 5
lambdify
всегда предпочитает_imp_
реализаций к реализациям в других пространствах имен, если только входной параметрuse_imps
не имеет значение False.Использование с Tensorflow:
>>> импортировать тензорный поток как tf >>> из sympy import Max, sin, lambdify >>> из sympy.abc импортировать x
>>> f = Макс(х, грех(х)) >>> func = lambdify(x, f, 'tensorflow')
После tensorflow v2 активное выполнение включено по умолчанию. Если вы хотите получить совместимый результат для tensorflow v1 и v2 как и в этом руководстве, запустите эту строку.
>>> tf.compat.v1.enable_eager_execution()
Если у вас включено активное выполнение, вы можете получить результат сразу же, как вы можете использовать numpy.
Если вы передаете объекты тензорного потока, вы можете получить
EagerTensor
объект вместо значения.>>> результат = функция (tf.constant (1.0)) >>> распечатать(результат) tf.Tensor(1.0, shape=(), dtype=float32) >>> печать (результат.__класс__) <класс 'tensorflow.python.framework.ops.EagerTensor'>
Вы можете использовать
.numpy()
для получения значения numpy тензора.>>> результат.numpy() 1,0
>>> var = tf.Variable(2.0) >>> result = func(var) # также работает для tf.Variable и tf.Placeholder >>> результат.numpy() 2.0
Работает с массивом любой формы.
>>> тензор = tf. constant([[1.0, 2.0], [3.0, 4.0]]) >>> результат = функция (тензор) >>> результат.numpy() [[1. 2.] [3. 4.]]
Примечания
Для функций, включающих вычисления больших массивов, numexpr может предоставить значительное ускорение по сравнению с numpy. Обратите внимание, что доступные функции for numexpr более ограничены, чем numpy, но могут быть расширены с помощью
реализованная_функция
и определяемые пользователем подклассы функции. Если указано, numexpr может быть единственным параметром в модулях. Официальный список функций numexpr можно найти по адресу: https://numexpr.readthedocs.io/en/latest/user_guide.html#supported-functionsВ приведенных выше примерах сгенерированные функции могут принимать скалярные значения или массивы numpy в качестве аргументов. Однако в некоторых случаях сгенерированная функция полагается на ввод, являющийся массивом numpy:
>>> импортировать numpy >>> из sympy импортировать кусочно >>> из sympy. testing.pytest импортировать ignore_warnings >>> f = lambdify(x, Piecewise((x, x <= 1), (1/x, x > 1)), "numpy")
>>> с ignore_warnings (RuntimeWarning): ... f (numpy.array ([-1, 0, 1, 2])) [-1. 0. 1. 0,5]
>>> ф(0) Traceback (последний последний вызов): ... ZeroDivisionError: деление на ноль
В таких случаях ввод должен быть заключен в массив numpy:
>>> с ignore_warnings (RuntimeWarning): ... поплавок (f (numpy.array ([0]))) 0,0
Или, если функциональность numpy не требуется, можно использовать другой модуль:
>>> f = lambdify(x, Piecewise((x, x <= 1), (1/x, x > 1)), "math") >>> ф(0) 0
Как это работает
При использовании этой функции очень полезно иметь представление о том, что она делается. По своей сути lambdify — это не что иное, как пространство имен. перевод поверх специального принтера, который заставляет работать некоторые угловые случаи правильно.
Чтобы понять lambdify, сначала мы должны правильно понять, как Python пространства имен работают. Скажем, у нас было два файла. Один называется
sin_cos_sympy.py
, с# sin_cos_sympy.py из sympy.functions.elementary.trigonometric import (cos, sin) определение sin_cos(x): вернуть грех (х) + соз (х)
и один с именем
sin_cos_numpy.py
с# sin_cos_numpy.py из numpy import sin, cos определение sin_cos(x): вернуть грех (х) + соз (х)
Два файла определяют идентичную функцию
sin_cos
. Однако в первый файл,sin
иcos
определяются как SymPysin
ипотому что
. Во втором они определяются как версии NumPy.Если бы мы импортировали первый файл и использовали функцию
sin_cos
, мы получится что-то вроде>>> из sin_cos_sympy импортировать sin_cos >>> sin_cos(1) потому что (1) + грех (1)
С другой стороны, если мы импортировали
sin_cos
из второго файла, мы получил бы>>> из sin_cos_numpy импортировать sin_cos >>> sin_cos(1) 1. 38177329068
В первом случае мы получили символьный вывод, т.к.
sin
иcos
функционируют из SymPy. Во втором мы получили числовое значение. результат, потому чтоsin_cos
использовал числовые функцииsin
иcos
из NumPy. Но обратите внимание, что версииsin
иcos
, которые были used не было свойственно определению функцииsin_cos
. Обе Определенияsin_cos
точно такие же. Скорее, он основывался на имена, определенные в модуле, где была определена функцияsin_cos
.Ключевым моментом здесь является то, что когда функция в Python ссылается на имя, не определено в функции, это имя ищется в «глобальном» пространство имен модуля, в котором определена эта функция.
Теперь в Python мы можем эмулировать это поведение без фактического написания файл на диск с помощью функции
exec
.exec
принимает строку содержащий блок кода Python и словарь, который должен содержать глобальные переменные модуля. Затем он выполняет код «внутри», который словарь, как если бы это были глобальные переменные модуля. Следующее эквивалентно кsin_cos
, определенному вsin_cos_sympy.py
:>>> импортировать симпи >>> module_dictionary = {'sin': sympy.sin, 'cos': sympy.cos} >>> выполнить(''' ... определение sin_cos(x): ... вернуть sin(x) + cos(x) ... ''', модульный_словарь) >>> sin_cos = модуль_словарь['sin_cos'] >>> sin_cos(1) потому что (1) + грех (1)
и аналогично
sin_cos_numpy
:>>> импортировать numpy >>> module_dictionary = {'sin': numpy.sin, 'cos': numpy.cos} >>> выполнить(''' ... определение sin_cos(x): ... вернуть sin(x) + cos(x) ... ''', модульный_словарь) >>> sin_cos = модуль_словарь['sin_cos'] >>> sin_cos(1) 1.38177329068
Итак, теперь мы можем понять, как работает
lambdify
. Название «ламбдифай» исходит из того факта, что мы можем думать о чем-то вродеlambdify(x, sin(x) + cos(x), 'numpy')
каклямбда x: sin(x) + cos(x)
, гдеsin
иcos
происходят из пространства именnumpy
. Вот почему аргумент символов является первым вlambdify
, в отличие от большинства SymPy функции там, где оно стоит после выражения: чтобы лучше имитироватьлямбда
ключевое слово.lambdify
принимает входное выражение (например,sin(x) + cos(x)
) иПреобразует в строку
Создает глобальный словарь модулей на основе модулей, передано (по умолчанию используется модуль NumPy)
Создает строку
"def func({vars}): return {expr}"
, где{vars}
— это список переменных, разделенных запятыми, и{expr}
— это строка созданный на шаге 1., затемexec`а эта строка с глобальными переменными модуля namespace и возвращает func
.
На самом деле функции, возвращаемые
lambdify
, поддерживают проверку. Так что вы можете посмотрите, как именно они определяются с помощьюinspect. getsource
или??
если вы используют IPython или блокнот Jupyter.>>> f = lambdify(x, sin(x) + cos(x)) >>> импорт проверить >>> распечатать (проверить.getsource (f)) защита _lambdifygenerated(x): вернуть грех (х) + соз (х)
Здесь показан исходный код функции, но не ее пространство имен. был определен в. Мы можем проверить это, взглянув на
__globals__
атрибутf
:>>> f.__globals__['sin']
>>> f.__globals__['cos'] >>> f.__globals__['sin'] равно numpy.sin Истинный Это показывает нам, что
грех
ипотому что
в пространстве именф
будетnumpy.sin
иnumpy.cos
.Обратите внимание, что на каждом из этих шагов есть несколько вспомогательных слоев, но в ядро, так работает
lambdify
. Шаг 1 выполняется с помощьюLambdaPrinter
принтеры, определенные в модуле печати (см.sympy.printing.lambdarepr
). Это позволяет использовать различные выражения SymPy. чтобы определить, как они должны быть преобразованы в строку для разных модулей. Вы можете изменить принтерlambdify
использует, передавая пользовательский принтер в аргумент принтераШаг 2 дополнен некоторыми переводами. Есть по умолчанию переводы для каждого модуля, но вы можете предоставить свои собственные, передав list в аргумент модулей . Например,
>>> определение mysin(x): ... print('взять на себя грех', x) ... вернуть numpy.sin(x) ... >>> f = lambdify(x, sin(x), [{'sin': mysin}, 'numpy']) >>> ф(1) взять на себя грех 1 0,8414709848078965
Словарь globals создается из списка путем слияния словарь
{'sin': mysin}
и модуль словаря для NumPy. слияние выполняется так, что более ранние элементы имеют приоритет, поэтомуmysin
используется выше вместоnumpy. sin
.Если вы хотите изменить способ работы
lambdify
для данной функции, Обычно проще всего это сделать, изменив словарь globals как таковой. В более сложных случаях может потребоваться создание и передача заказной принтер.Наконец, шаг 3 дополнен некоторыми удобными операциями, такими как добавление строки документации.
Понимание того, как работает
lambdify
, поможет избежать определенных ошибки при его использовании. Например, распространенной ошибкой является создание lambdified функцию для одного модуля (скажем, NumPy) и передавать ей объекты из другой (скажем, выражение SymPy).Например, мы создаем
>>> из sympy.abc импортировать x >>> f = lambdify(x, x + 1, 'numpy')
Теперь, если мы передаем массив NumPy, мы получаем этот массив плюс 1
>>> импортировать numpy >>> a = numpy.array([1, 2]) >>> ф(а) [2 3]
Но что произойдет, если вы совершите ошибку, передав выражение SymPy вместо массива NumPy:
>>> f(x + 1) х + 2
Это сработало, но случайно. Теперь возьми другой ламбдифицированный функция:
>>> из sympy import sin >>> g = lambdify(x, x + sin(x), 'numpy')
Это работает, как и ожидалось, для массивов NumPy:
>>> г(а) [1,84147098 2,743]
Но если мы попытаемся передать выражение SymPy, произойдет сбой
>>> попробуйте: ... г (х + 1) ... # Выпуск NumPy после 1.17 вызывает TypeError вместо ... # Ошибка атрибута ... кроме (AttributeError, TypeError): ... поднять AttributeError() Traceback (последний последний вызов): ... Ошибка атрибута:
Теперь давайте посмотрим, что произошло. Причина, по которой это не удается, заключается в том, что
g
вызываетnumpy.sin
для входного выражения, аnumpy.sin
не знать, как работать с объектом SymPy. Как правило, NumPy функции не знают, как работать с выражениями SymPy, а SymPy функции не умеют работать с массивами NumPy. Вот почему существует: для обеспечения моста между SymPy и NumPy.