<p>在<code>isympy</code>会话中:</p>
<pre><code>In [1]: import numpy as np
In [3]: SymsX = Symbol('SymsX')
In [5]: SymsX/np.pi # symbol * float
Out[5]: 0.318309886183791⋅SymsX
In [6]: SymsX/pi # symbol * symbol
Out[6]:
SymsX
─────
π
In [7]: sqrt(SymsX/pi) # sympy sqrt
Out[7]:
_______
╲╱ SymsX
─────────
√π
In [8]: np.sqrt(SymsX/pi) # numeric sqrt
-
AttributeError Traceback (most recent call last)
AttributeError: 'Mul' object has no attribute 'sqrt'
The above exception was the direct cause of the following exception:
TypeError Traceback (most recent call last)
<ipython-input-8-27f855f6b3e2> in <module>
> 1 np.sqrt(SymsX/pi)
TypeError: loop of ufunc does not support argument 0 of type Mul which has no callable sqrt method
</code></pre>
<p><code>np.sqrt</code>必须首先将其输入转换为numpy数组:</p>
^{pr2}$
<p>这是一个对象数据类型数组,不是普通的数值数组。给定这样的数组,qnumpy<code>ufunc</code>尝试将操作委托给element方法。e、 g.<code>(0.31*SymsX).sqrt()</code></p>
<p>乘法和加法可用于此对象数组:</p>
<pre><code>In [11]: 2*_
Out[11]: 0.636619772367581⋅SymsX
In [12]: _ + __
Out[12]: 0.954929658551372⋅SymsX
</code></pre>
<p>因为<code>sympy</code>对象具有正确的加法和乘法方法:</p>
<pre><code>In [14]: Out[5].__add__
Out[14]: <bound method Expr.__add__ of 0.318309886183791*SymsX>
In [15]: Out[5]+2*Out[5]
Out[15]: 0.954929658551372⋅SymsX
</code></pre>
<p>===</p>
<p><code>sympy.lambdify</code>是同时使用<code>sympy</code>和{<cd8>}的最佳工具。查一下它的文件。在</p>
<p>在这种情况下,<code>SymsX/pi</code>表达式可以转换为numpy表达式,其中:</p>
<pre><code>In [18]: lambdify(SymsX, Out[5],'numpy')
Out[18]: <function _lambdifygenerated(SymsX)>
In [19]: _(23) # evaluate with `SymsX=23`:
Out[19]: 7.321127382227194
In [20]: 23/np.pi
Out[20]: 7.321127382227186
In [21]: np.sqrt(_19) # np.sqrt now works on the number
Out[21]: 2.7057581899030065
</code></pre>
<p>===</p>
<p><code>sympy</code>中的相同评估:</p>
<pre><code>In [23]: expr = sqrt(SymsX/pi)
In [24]: expr
Out[24]:
_______
╲╱ SymsX
─────────
√π
In [25]: expr.subs(SymsX, 23)
Out[25]:
√23
───
√π
In [27]: _.evalf()
Out[27]: 2.70575818990300
</code></pre>