我正在尝试在内部使用sp.Max(x,0)来粗化大型分析表达式。我想使用numpy对向量进行矢量化处理,因此x将是一个数组。我需要x和0的逐元素最大值。不过,默认情况下,sympy将sp.Max更改为np.amax。它沿着轴找到最大值,这不是我所需要的。lambdify中的“模块”关键字无法正常运行。我试过了:
import numpy as np
import sympy as sp
arr = np.array([1, 2, 3])
expr = sp.sin(x) + sp.Max(x, 0)
f = sp.lambdify(x, expr, modules=[{'Max': np.maximum}, 'numpy']) # docs say, priority of modules matters
help(f)
它给:
Help on function _lambdifygenerated:
_lambdifygenerated(x)
Created with lambdify. Signature:
func(x)
Expression:
sin(x) + Max(0, x)
Source code:
def _lambdifygenerated(x):
return (sin(x) + amax((0,x)))
Imported modules:
由于某种原因,sp.Max更改为amax。
如果'numpy'未包含在'modules'列表中,它将简单地跳过所有其他功能。我也尝试在列表中交换dict和'numpy',但没有帮助。请澄清一下,怎么了?它是sympy中的错误吗?
当lambdify
用于创建旨在进行矢量化的numpy函数时,通常会存在一些细微的问题,尤其是当变量(x
)和常量(0
)混合在一起时。
在这种情况下,sp.max
假设其所有可能的许多参数都是单个值。np.amax
获取一个扁平数组的最大值。np.maximum
获取两个数组的按元素最大值。这里的问题是常量0
不会自动扩展为numpy数组。
我的解决方法是将其替换sp.max
为基于的自定义函数sp.Piecewise
。请注意,如果的参数超过2个,则需要一个单独的函数sp.max
。
import numpy as np
import sympy as sp
from sympy.abc import x
def sympy_max2(a, b):
return sp.Piecewise((b, a < b), (a, True))
arr = np.array([11, 22, 33, -1, -2])
expr = sp.sin(x) + sympy_max2(0, x)
f = sp.lambdify(x, expr, modules=['numpy'])
print(f(arr)) # [10.00000979 21.99114869 33.99991186 -0.84147098 -0.90929743]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句