Как в примере ниже можно исключить вычисление элементов с делением на ноль. Функция выдает правильный результат, но бессмысленно считает элементы, для которых происходит деление на ноль.
$ cat ttest.py
#!/usr/bin/python
import numpy
import sympy
x,y=sympy.symbols('x y')
G=1./(x-y)
F=sympy.diff(G,x)
sympy.pprint(F)
def FunWithoutDivZero(sFunct=None):
def lmbd(a,b):
result=numpy.zeros_like(a-b)
gd=(a!=b)
#a[numpy.logical_not(gd)]+=1.
result[gd]=sympy.lambdify((x,y),sFunct,modules='numpy')(a,b)[gd]
return result
return lmbd
KF=FunWithoutDivZero(sFunct=F)
t=numpy.array([1.,2.,3.,4.,5.])
u=numpy.array([1.,2.,3.,4.,5.]).reshape(-1,1)
print KF(t,u)
$ ./ttest.py
-1
────────
2
(x - y)
Warning: divide by zero encountered in true_divide
[[ 0. -1. -0.25 -0.11111111 -0.0625 ]
[-1. 0. -1. -0.25 -0.11111111]
[-0.25 -1. 0. -1. -0.25 ]
[-0.11111111 -0.25 -1. 0. -1. ]
[-0.0625 -0.11111111 -0.25 -1. 0. ]]
p.s. если бы можно было определить символьную функцию как G= при x!=y вернуть 1/(x-y), а при x=y вернуть 0.0, то все было бы ok.
p.s. 2 поэлементное решение слишком медленное (работает в десятки раз медлее):
def withoutZero(sFunct=None,eps=0.0001):
def lmbd(a,b):
if numpy.abs(a-b)>eps:
return sympy.lambdify((x,y),sFunct,modules='numpy')(a,b)
else: return 0.0
return numpy.vectorize(lmbd)