【发布时间】:2021-06-12 00:33:19
【问题描述】:
Sympy lambdify 可用于连接 numpy 和 sympy 之间的功能。但是,我找不到使用lambdify时存在哪些缺点。例如,我有兴趣将 Max 与 sympy 和 numpy 一起使用:
f = lambdify([x], Max(x, 1), 'numpy')
f(np.array([-1,0,1]))
抛出 ValueError:
ValueError: The argument '[-1, 0, 1]' is not comparable.
另一方面,使用 dunder 方法的粗略操作可以正常工作:
f = lambdify([x], Add(x, 1), 'numpy')
f(np.array([-1,0,1]))
输出:
array([0, 1, 2])
最终,我希望 lambdify 使用包含 sympy Symbol 对象(或 sympy.tensor.array.Array)的 numpy 数组:
a = symarray('a', (3,))
f = lambdify([x], Max(x, 1), 'numpy')
f(a)
抛出类型错误:
TypeError: cannot determine truth value of Relational
我的预期输出是:
array([Max(1, a_0), Max(1, a_1), Max(1, a_2)], dtype=object)
当然,我可以使用列表推导来实现这一点。
【问题讨论】:
-
你为什么不使用列表理解?
-
我认为广播/减少某些轴时会很复杂,但也许 numpy 通过使用某种迭代器来支持这一点?我想 einsum 是最糟糕的,因为我可能需要自己解析下标字符串。
-
我没有使用过
symarray,但看起来您将其视为任何其他对象 dtype 数组。这意味着一些数学直接起作用,例如a+1- 不需要lambdify。但是将“函数”应用于a(例如Max)的每个元素需要显式迭代。查看我的编辑。 -
据我所知
np.max是np.maximum.reduce的简写,就像np.sum是np.add.reduce的简写一样。我可以按照 hpaulj 的建议使用frompyfunc以元素方式将np.maximum或np.add应用于对象数组。另一方面,我发现很难应用像reduce这样的泛化函数。