LINUX.ORG.RU

передать условие в lambdify функцию

 , ,


0

1

Некоторая функция w конструируется путем дифференцирования (как она выглядит не нужно знать, но пользоваться этой функцией нужно). Известно что при условии модуль (t-u) > epsilon функцией можно пользоваться, при модуль (t-u) > epsilon --- нет. Как бы передать это условие в «конструктор» функции ? В примере ниже, результат правильный, но тратится время на бесполезное деление на ноль и вылетает предупреждение.

$ cat  ttest.py 
#!/usr/bin/python
import sympy
import numpy
x,y=sympy.symbols('x y')
f=1/(x-y)
v=sympy.diff(f,x)
w=sympy.lambdify((x,y),v)
t=numpy.array([1,2,3,4,5]).reshape(-1,1)
u=numpy.array([1,3]).reshape(1,-1)
plusIndex=numpy.abs(t-u)>0.00001
R=numpy.ones((5,2),dtype='d')
R[plusIndex]=w(t,u)[plusIndex]
print R


$ ./ttest.py 
Warning: divide by zero encountered in true_divide
[[ 1.         -0.25      ]
 [-1.         -1.        ]
 [-0.25        1.        ]
 [-0.11111111 -1.        ]
 [-0.0625     -0.25      ]]



Последнее исправление: cetjs2 (всего исправлений: 1)

казалось бы решение такое

попытка как-то вписать условие в lambdy функцию, но понятно что это условие подходит для поэлементной работы, но не для вектороной :-( :

$ cat ttest.py 
#!/usr/bin/python
import sympy
import numpy
x,y=sympy.symbols('x y')
f=1/(x-y)
v=sympy.diff(f,x)
w=sympy.lambdify((x,y), v if sympy.abs(x-y)>0.001 else 0.0 , modules='numpy')
t=numpy.array([1,2,3,4,5]).reshape(-1,1)
u=numpy.array([1,3]).reshape(1,-1)
plusIndex=numpy.abs(t-u)>0.00001
R=numpy.ones((5,2),dtype='d')
#R[plusIndex]=w(t,u)[plusIndex]
R=w(t,u)
print R


$ ./ttest.py 
Warning: divide by zero encountered in true_divide
[[       -inf -0.25      ]
 [-1.         -1.        ]
 [-0.25              -inf]
 [-0.11111111 -1.        ]
 [-0.0625     -0.25      ]]

dmitry-d67
() автор топика
Ответ на: казалось бы решение такое от dmitry-d67

решение удалось найти.

def functW(_t_,_u_):
    if _t_ != _u_: return w(_t_,_u_)
    else: return 0.0
W=numpy.vectorize(functW)
print W(t,u)

Не знаю насколько эффективен vectorize по скорости работы. Принимаю замечания - может можно эффективнее.

dmitry-d67
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.