取一个碰巧被命名为的未定义函数dot
,并将其作为以下内容的一部分lambdify
:
import numpy
import sympy
class dot(sympy.Function):
pass
x = sympy.Symbol('x')
a = sympy.Matrix([1, 0, 0])
f = sympy.lambdify(x, dot(a.T, x))
x = numpy.array([3, 2, 1])
print(f(x))
惊喜:这实际上有效!
显然,该字符串"dot"
以某种方式被提取并由点积的实现代替。有人知道吗?
以上结果为[3]
。但是,我想得到标量3
。(如何)可以修改f()
以实现该目标?
我不是sympy
用户,但是引用其文档lambdify
说:
如果用户没有另外指定,SymPy函数将尽可能用
python-math
,numpy
(如果可用)或mpmath
函数替换-完全按此顺序。要更改此行为,可以使用“模块”自变量。它接受:
- 字符串“ math”,“ mpmath”,“ numpy”,“ numexpr”,“ sympy”
- 任何模块(例如数学)
- 将sympy函数的名称映射到任意函数的字典
- 包含上述参数混合的列表,具有较高优先级的条目将首先出现。
因此,似乎如果您已python-math
安装它将使用该版本,如果未numpy
安装,则将使用numpy
的版本,否则mpmat
,然后说明如何修改此行为。
在您的情况下,只需提供一个modules
值,该值是一个字典,该字典将名称映射dot
到您想要返回标量的函数。
我的意思是一个例子:
>>> import numpy as np
>>> import sympy
>>> class dot(sympy.Function): pass
...
>>> x = sympy.Symbol('x')
>>> a = sympy.Matrix([1,0,0])
>>> f = sympy.lambdify(x, dot(a.T, x), modules=[{'dot': lambda x, y: np.dot(x, y)[0]}, 'numpy'])
>>> y = np.array([3,2,1])
>>> print(f(y))
3
>>> print(type(f(y)))
<class 'numpy.int64'>
如您所见,通过处理modules
参数可以实现所需的功能。我在这里的实现绝对是幼稚的,但是您可以将其概括为:
>>> def my_dot(x, y):
... res = np.dot(x, y)
... if res.ndim == 1 and res.size == 1:
... return res[0]
... return res
此函数检查法线的结果是否dot
为标量,如果是,则返回普通标量,否则返回与相同的结果np.dot
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句