更新:此错误已在 SymPy 1.2 中修复,请参阅 its release notes。如果您遇到此错误,请更新您的 SymPy 安装。
这个非常棘手,而且令人惊讶。这是名为 lam 的 lambda 的文档字符串:
<lambda> lambda _Dummy_22, _Dummy_23, _Dummy_24, _Dummy_25
Created with lambdify. Signature:
func(z, x, y, t)
Expression:
And(Or(x, y, z), t)
到目前为止一切顺利。好吧,我已经注意到您的输入参数是自动选择的,您不知道它们的顺序。我会明确设置诸如lambdify((x,y,z,t),rule) 之类的顺序,但我不知道您的实际应用程序(我只是想我会注意这一点)。
无论如何,在 sympy 中尝试它显然可以正常工作:
>>> And(Or(False,False,False),True)
False
在我的 IPython 系统上,这是我得到的完整错误:
----> 1 lam(*params)
/usr/lib/python3/dist-packages/numpy/__init__.py in <lambda>(_Dummy_34, _Dummy_35, _Dummy_36, _Dummy_37)
TypeError: return arrays must be of ArrayType
注意错误中的 numpy 路径。由于我安装了 numpy,lambdify 尝试将符号表达式映射到 numpy 函数。由于您的表达式中只有And 和Or,我只能假设它们分别是numpy.logical_and 和numpy.logical_or。但这是交易(为简单起见,回到香草 REPL):
>>> import numpy as np
>>> np.logical_or(False,False,False)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: return arrays must be of ArrayType
糟糕,你的问题是:numpy 的逻辑运算符是二进制的! operator.and_ 也是如此:
>>> import operator
>>> operator.and_(False,False,False)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: op_and_ expected 2 arguments, got 3
lambdify 用于将符号表达式转换为数值的标准逻辑运算符不接受两个以上的输入参数。在 numpy 案例中出现神秘错误消息的原因是二进制 ufunc logical_or 的第三个输入参数被解释为输出数组而不是第三个操作数,但在这个 sympy 上下文中,这完全出乎意料。
我的建议是使用all/any 或numpy.all/numpy.any 作为您的具体示例,作为lambdify 的modules 关键字参数传递:
>>> lam = lambdify(atoms, rule,modules={'And':all, 'Or':any})
>>> lam(*params)
False
这允许您定义自己的函数,用于进行从符号到数字的映射。