#python #numpy #sympy
#python #numpy #симпатия
Вопрос:
У меня есть функция, которая возвращает массив numpy следующим образом:
import numpy as np
from scipy.misc import derivative
import sympy as sp
x, y = sp.symbols('x y')
f = x**2 y **2
def grad(f):
exp = sp.expand(f)
dfdx = sp.diff(exp,x)
dfdy = sp.diff(exp,y)
global grad
Df = np.array([dfdx,dfdy])
return Df
Я использую переменную Df
в другой функции и выполняю с ней некоторые вычисления.
Как вы, возможно, догадались, результаты выдаются, включая x
и y
. Однако мне нужно, чтобы результаты каждый раз оценивались с начальными значениями, которые я выбираю для x
и y
вместо символов.
Мне было интересно, есть ли что-то подобное .subs()
в sympy, но работает с массивом numpy, а не с функцией????
Комментарии:
1. Почему вы
numpy
вообще используете? Придерживайтесьsympy
2. Ваш
Df
объект представляет собой массив dtype (посмотритеDf.dtype
). Это в основном то же самое, что и список[dfdx, dfdy]
. Математика для такого массива делегирует действие методам элементов. Так что математика является случайной и не быстрой.numpy
не имеет «знаний» обsympy
объектах.3. Я использую numpy для всего кода и почему-то подумал, что должен заставить это работать и с ним, вместо того, чтобы думать о том, что сказал @JohanC. спасибо всем. Мой образ мышления был неправильным с самого начала.
Ответ №1:
Sympy и numpy — это два разных мира, которые нелегко объединить.
С помощью lambdify sympy можно заставить выражения sympy работать с аргументами numpy. Когда массивы используются в качестве аргументов, все они должны быть 1D и одинакового размера. Приведенная np_grad_1
ниже функция является стандартной. Он возвращает массив с двумя подмассивами.
Чтобы получить желаемую функциональность, оболочка может принимать входные данные 2D numpy и преобразовывать результат обратно в массив 2D numpy:
import sympy as sp
import numpy as np
x, y = sp.symbols('x y')
f = x ** 2 y ** 2
def grad(f, x, y):
exp = sp.expand(f)
dfdx = sp.diff(exp, x)
dfdy = sp.diff(exp, y)
return [dfdx, dfdy]
np_grad_1 = sp.lambdify([x, y], grad(f, x, y))
np_grad_2 = lambda points: np.array(np_grad_1(points[:, 0], points[:, 1])).T
points = np.random.uniform(-1, 1, (5, 2))
np_grad_1(points[:, 0], points[:, 1]) # returns an array with 2 subarrays
np_grad_2(points) # returns an Nx2 array
Комментарии:
1. Сначала я пытался использовать lambdify, но почему-то пропустил это !. это делает вещи понятными для меня. Спасибо, я могу исправить довольно много в своем коде.
2. о, я относительно новичок в StackOverflow, как мне это сделать?
3. Да, я думаю, я только что узнал, как