Вычисление массива numpy

#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. Да, я думаю, я только что узнал, как