gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:23:27 24 4
gpt4 key购买 nike

我正在尝试使用 sp.Max(x, 0) 对大型解析表达式进行lambdify。我想使用 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' 未包含在 'modules' 列表中,则它只是跳过所有其他函数。我还尝试在列表中交换 dict 和 'numpy',但没有帮助。请澄清一下,有什么问题吗?这是 sympy 中的错误吗?

最佳答案

使用时 lambdify要创建旨在矢量化工作的 numpy 函数,通常有 subtle problems ,尤其是当变量 ( x ) 和常量 ( 0 ) 混合使用时。

在这种情况下,sp.max假设所有可能的许多参数都是单个值。 np.amax获取一个扁平数组的最大值。 np.maximum获取两个数组的元素最大值。这里的问题是常量 0不会自动扩展为 numpy 数组。

我的解决方法是更换 sp.max带有基于 sp.Piecewise 的自定义函数.请注意,如果 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]

关于python - 如何使用 sympy.lambdify 和 Max 函数来替换 numpy.maximum 而不是 numpy.amax?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60723841/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com