TypeError:返回数组必须是使用python中的sympy lambdify的ArrayType

时间:2017-02-04 21:38:42

标签: python numpy lambda sympy

我有以下代码:

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

我无法理解为什么,对于其他规则来说它很有效。

1 个答案:

答案 0 :(得分:3)

更新:此错误已在SymPy 1.2中修复,请参阅its release notes。如果您遇到此错误,请更新您的SymPy安装。

这个非常棘手,令人惊讶。这是您的lambda的文档字符串,名为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)这样的订单,但我不知道您的实际应用(我只是想我会注意到这一点)。

无论如何,在同情中尝试它显然工作正常:

>>> 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函数。由于您的表达式中只有AndOr,因此我只能假设它们分别是numpy.logical_andnumpy.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/anynumpy.all/numpy.any作为您的具体示例,作为modules的{​​{1}}关键字参数传递:

lambdify

这允许您定义自己的函数,用于执行从符号到数字的映射。