код без векторизаии поэлементной функции работает гораздо быстрее (т.к. vectorize, даже с otypes= работает очень медленно). Можно ли в коде ниже избавиться от расчетов элементов с делением на ноль, если их индексы известны (на месте таких элеметов д.б. ноль)?
#!/usr/bin/python
import numpy
import sympy
x,y=sympy.symbols('x y')
G=1/(x-y)+sympy.log(sympy.abs(x-y))
F=sympy.diff(G,x)
sympy.pprint(F)
def lmbdFun(sFunct=None):
return sympy.lambdify((x,y),sFunct,modules='numpy')
KF=lmbdFun(sFunct=F)
t=numpy.array([1,2,3,4,5])
u=numpy.array([1,3,3,5,5])
res=numpy.zeros(5)
good=(t!=u)
res[good]=KF(t,u)[good]
print res
$ ./ttest.py
re(x - y) 1
───────── - ────────
2 2
│x - y│ (x - y)
Warning: invalid value encountered in true_divide
Warning: divide by zero encountered in true_divide
[ 0. -2. 0. -2. 0.]
p.S. это код считает все верно, но хочется избавится об бессмысленных вычислений с делением на ноль.
некрасиво, но работает
$ cat ./ttest.py
#!/usr/bin/python
import numpy
import sympy
x,y=sympy.symbols('x y')
G=1/(x-y)+sympy.log(sympy.abs(x-y))
F=sympy.diff(G,x)
sympy.pprint(F)
def lmbdFun(sFunct=None):
return sympy.lambdify((x,y),sFunct,modules='numpy')
KF=lmbdFun(sFunct=F)
t=numpy.array([1,2,3,4,5])
u=numpy.array([1,3,3,5,5])
res=numpy.zeros(5)
good=(t!=u)
bad=(t==u)
t[bad]=u[bad]+1
res[good]=KF(t,u)[good]
print res