我如何使用 sympy.lambdify 和 Max 函数来替换 numpy.maximum 而不是 numpy.amax?
How do I use sympy.lambdify with Max function to substitute numpy.maximum instead of numpy.amax?
我正在尝试对内部包含 sp.Max(x, 0) 的大解析表达式进行 lambdify。我想使用 numpy 来向量化我的计算,所以 x 将是一个数组。我需要 x 和 0 的元素最大值。不过,默认情况下,sympy 将 sp.Max 更改为 np.amax。它沿轴找到最大值,这不是我需要的。 "modules" 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 中的错误吗?
在当前版本的 SymPy 中,我在签名中得到 return (sin(x) + amax((0,x), axis=0))
。这是你想要的吗?
当使用 lambdify
创建用于矢量化的 numpy 函数时,通常会有 ,尤其是当变量 (x
) 和常量 (0
) 是混合。
在这种情况下,sp.max
假设所有可能的许多参数都是单个值。 np.amax
获取一个展平数组的最大值。 np.maximum
获取两个数组的元素最大值。这里的问题是常量 0
不会自动扩展为 numpy 数组。
我的解决方法是用基于 sp.Piecewise
的自定义函数替换 sp.max
。请注意,如果 sp.max
.
的参数超过 2 个,则需要一个单独的函数
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]
要使用 np.maximum
函数而不是 np.amax
,我发现指定 amax
方法而不是 Max
是可行的。 np.maximum
函数也需要一些调整,以接收用于 amax
函数的参数。
import numpy as np
import sympy as sp
arr = np.array([11, 22, 33, -1, -2])
expr = sp.sin(x) + sp.Max(x, 0)
def custom_amax(x,**kwargs):
return np.maximum(x[0],x[1])
f = sp.lambdify(x, expr, modules=[{'amax': custom_amax}, 'numpy'])
f(arr) # [10.00000979, 21.99114869, 33.99991186, -0.84147098, -0.90929743]
我正在尝试对内部包含 sp.Max(x, 0) 的大解析表达式进行 lambdify。我想使用 numpy 来向量化我的计算,所以 x 将是一个数组。我需要 x 和 0 的元素最大值。不过,默认情况下,sympy 将 sp.Max 更改为 np.amax。它沿轴找到最大值,这不是我需要的。 "modules" 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 中的错误吗?
在当前版本的 SymPy 中,我在签名中得到 return (sin(x) + amax((0,x), axis=0))
。这是你想要的吗?
当使用 lambdify
创建用于矢量化的 numpy 函数时,通常会有 x
) 和常量 (0
) 是混合。
在这种情况下,sp.max
假设所有可能的许多参数都是单个值。 np.amax
获取一个展平数组的最大值。 np.maximum
获取两个数组的元素最大值。这里的问题是常量 0
不会自动扩展为 numpy 数组。
我的解决方法是用基于 sp.Piecewise
的自定义函数替换 sp.max
。请注意,如果 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]
要使用 np.maximum
函数而不是 np.amax
,我发现指定 amax
方法而不是 Max
是可行的。 np.maximum
函数也需要一些调整,以接收用于 amax
函数的参数。
import numpy as np
import sympy as sp
arr = np.array([11, 22, 33, -1, -2])
expr = sp.sin(x) + sp.Max(x, 0)
def custom_amax(x,**kwargs):
return np.maximum(x[0],x[1])
f = sp.lambdify(x, expr, modules=[{'amax': custom_amax}, 'numpy'])
f(arr) # [10.00000979, 21.99114869, 33.99991186, -0.84147098, -0.90929743]