Sympy Lambdify с вводом массива

Я пытаюсь предоставить массив в качестве входных данных и ожидаю массив в качестве выходных данных для следующего кода.

from sympy import symbols
from sympy.utilities.lambdify import lambdify
import os
from sympy import *
import numpy as np

text=open('expr.txt','r')
expr=text.read()
x,param1,param2=symbols('x param1 param2')
params=np.array([param1,param2])
T=lambdify((x,params),expr,modules='numpy')
data=np.genfromtxt('datafile.csv',delimiter=',')
print T(data[0],[0.29,4.5])
text.close()

Но получаю следующую ошибку.

TypeError: <lambda>() takes exactly 3 arguments (13 given)

Как мне сказать sympy, что это единственный массив? Заранее спасибо.


person krishna    schedule 29.07.2014    source источник
comment
Что ты пытаешься сделать? Я вижу в вашем коде много ошибок. Переменная expr - это просто строка, а не выражение.   -  person miindlek    schedule 29.07.2014
comment
Это математическое выражение, включающее x, param1 и param2 в файле. Я пытаюсь оценить его при разных значениях x, учитывая param1 и param2   -  person krishna    schedule 29.07.2014
comment
как выглядит выражение?   -  person miindlek    schedule 29.07.2014
comment
2 * param1 / param2 * (x ** (param2-1) -x ** (- 1-param2 / 2))   -  person krishna    schedule 29.07.2014
comment
Не могли бы вы опубликовать, что находится в данных [0]?   -  person miindlek    schedule 29.07.2014
comment
data [0] - это массив. массив ([1., 0.97, 0.94, 0.91, 0.88, 0.85, 0.82, 0.79, 0.76, 0.73, 0.7])   -  person krishna    schedule 29.07.2014


Ответы (1)


1. Решение: Ваша проблема в том, что функция T ожидает значение, но вы раздаете список. Попробуйте это вместо print T(data[0],[0.29,4.5]), чтобы получить список результатов:

print [T(val,[0.29,4.5]) for val in data[0]]

Или используйте функцию-оболочку:

def arrayT(array, params):
    return [T(val, params) for val in array]

print arrayT(data[0], [0.29, 4.5])

2. Решение: вам нужно изменить свое математическое выражение. Почему-то sympy не работает со списком списков, поэтому попробуйте следующее:

expr = "2*y/z*(x**(z-1)-x**(-1-z/2))"
T=lambdify((x,y,z),expr,'numpy')

print T(data[0], 0.29, 4.5)
person miindlek    schedule 29.07.2014
comment
Я пробовал это, и это тоже работает, но проблема в том, что я каждый раз оцениваю T в другом месте с разными массивами, и поэтому мне нужно математическое выражение, которое способно принимать массивы и выдавать массивы. - person krishna; 29.07.2014
comment
Почему математическая функция должна иметь возможность принимать массивы? Не могли бы вы просто определить функцию-оболочку? - person miindlek; 29.07.2014
comment
Второе решение не работает, по-прежнему возникает та же ошибка. Используемые двойные квадратные скобки - person krishna; 29.07.2014
comment
Первое решение не является жизнеспособным вариантом, потому что у меня есть функция, которая выводит выражение. Есть и другие выражения, которые я уже закодировал. В настоящее время я работаю над случаем, когда пользователь может предоставить свою собственную математическую модель (выражение). Я должен использовать конкретную модель (выражение), выбранную пользователем, поэтому мне нужно, чтобы выражение работало с массивами. - person krishna; 29.07.2014
comment
Думаю, я понял. Обновил второе решение. Он работает на моей машине. - person miindlek; 29.07.2014
comment
Любая идея, почему sympy позволяет вводить только один массив? - person krishna; 29.07.2014
comment
Это позволяет использовать более одного массива. Но не массив массивов. Например: T(array([1,2,3]),array([4,5,6]),array([7,8,9])) также будет работать. - person miindlek; 29.07.2014