【问题标题】:Defining a function in SymPy that takes a list as argument在 SymPy 中定义一个以列表为参数的函数
【发布时间】:2021-06-22 11:37:13
【问题描述】:

我目前正在 python 的 GUI 应用程序中构建“公式编辑器”。 我根据subs 的字典,使用 sympy 来解析和检查键入公式的有效性。没问题。

有时,用户需要输入带有冗余参数的“复杂”公式。 请参阅下面的示例:

Array([0.9, 0.8, 1.0, 1.1])[Mod(p-1, 4)]

列表[0.9, 0.8, 1.0, 1.1] 由用户选择,可以是任意长度。给定p 变量的值,il 将产生列表的四个元素之一。数字4 显然是len([0.9, 0.8, 1.0, 1.1]。 用户很容易打错公式...

相反,我想创建自己的函数,例如。 userlist(),将列表作为参数并根据需要进行操作。

我已阅读 this,它帮助我从以数字为参数的函数开始。列表参数对我没有多大帮助。

提前谢谢你。


编辑: 简而言之,我需要以某种方式定义userlist(),以便这一行

parse_expr("userlist(p, [8, 4, 6, 7])").evalf(subs={'p': 10})

返回列表的Mod(p-1, len(list))th 元素(这里是第二个元素:4)。

【问题讨论】:

    标签: python sympy custom-function


    【解决方案1】:

    我不确定我是否理解您的要求,但也许这会有所帮助:

    In [75]: A = IndexedBase('A')
    
    In [76]: A[Mod(p-1, 4)]
    Out[76]: A[Mod(p + 3, 4)]
    
    In [77]: f = lambdify((p, A), A[Mod(p-1, 4)])
    
    In [78]: f(2, [3, 5, 6, 7])
    Out[78]: 5
    

    【讨论】:

    • 谢谢奥斯卡·本杰明。这是一个好的开始,因为我不知道 IndexedBase。我仍然需要将4 替换为len(A) 以更灵活。此外,我的第一个测试在解析字符串表达式时失败了。我编辑了我的问题;希望现在更清楚了。
    • 最后,我使用了这个:'userlist': lambda lst, p: Array(lst)[Mod((p - 1), len(lst))] 作为local_dict,以便以后可以计算表达式(给定一个 p 的值)
    【解决方案2】:

    好的,我看到您更新的问题。我仍然不确定我是否完全理解,但我希望这个示例会更有帮助:

    In [7]: parse_expr("userlist(p, [8, 4, 6, 7])", {'userlist': lambda a, b: print(a, b)})
    p [8, 4, 6, 7]
    

    这里的lambda 函数可以是你想使用的任何Python 函数,它会接收解析后的列表作为参数,因此它可以调用len 等。

    【讨论】:

    • 正是我需要的!非常感谢。如此简单,现在我明白了。
    猜你喜欢
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 2016-08-26
    • 2016-09-03
    • 2021-10-04
    • 2020-10-03
    相关资源
    最近更新 更多