我有以下代码:
x,y,z,t = var('x,y,z,t')
d = set([t])
rule = And(Or(x,y,z),t)
atoms = tuple(rule.atoms())
params = [True if i in d else False for i in atoms]
lam = lambdify(atoms, rule)
lam(*params)
其中抛出:
Traceback (most recent call last):
File "<pyshell#142>", line 7, in <module>
lam(*params)
File "<string>", line 1, in <lambda>
TypeError: return arrays must be of ArrayType
我不明白为什么,对于其他规则它的伟大工程。
更新:此bug已被固定在SymPy 1.2,看它的发行说明 。 如果您遇到这个错误更新SymPy安装。
这是一个相当棘手,并不足为奇。 这是你的拉姆达命名的文档字符串lam
:
<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
为您具体的例子,作为通过modules
的关键字参数lambdify
:
>>> lam = lambdify(atoms, rule,modules={'And':all, 'Or':any})
>>> lam(*params)
False
这允许您定义用于进行映射,从象征性的数字自己的函数。
文章来源: TypeError: return arrays must be of ArrayType using lambdify of sympy in python