我如何使用 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]