如何使用 sympy.lambdify 和 Max 函数来替换 numpy.maximum 而不是 numpy.amax?

2024-04-22

我正在尝试使用 sp.Max(x, 0) 来对大分析表达式进行羔羊化。我想使用 numpy 来向量化我的计算,因此 x 将是一个数组。我需要 x 和 0 的元素最大值。不过,sympy 默认情况下会将 sp.Max 更改为 np.amax。它沿轴找到最大值,这不是我需要的。 lambdify 中的“modules”关键字不能按我的预期工作。 我试过了:

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”未包含在“模块”列表中,它只会跳过所有其他函数。我还尝试在列表中交换 dict 和 'numpy',但没有帮助。请澄清一下,有什么问题吗?这是 sympy 中的错误吗?


使用时lambdify要创建旨在矢量化工作的 numpy 函数,通常有微妙的问题 https://stackoverflow.com/questions/59757573/sympy-lambdify-such-that-operations-on-arrays-always-result-in-arrays-also-for,特别是当变量 (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]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 sympy.lambdify 和 Max 函数来替换 numpy.maximum 而不是 numpy.amax? 的相关文章

随机推荐