<p>在<code>isympy</code>会话中(其中<code>x</code>,<code>y</code>已经定义)</p>
<pre><code>In [1]: coor = symbols('x y')
In [2]: coor
Out[2]: (x, y)
</code></pre>
<p><code>coor</code>是一个元组</p>
<pre><code>In [3]: xx = [coor[0]**2, coor[1]]
In [4]: xx
Out[4]:
⎡ 2 ⎤
⎣x , y⎦
</code></pre>
<p><code>xx</code>是一个包含2个Symphy对象的列表</p>
<p>如果我们制作一个对象数据类型数组,我们可以指定sympy元素:</p>
<pre><code>In [5]: xy = np.empty((2,2),object)
In [6]: for i in range(2):
...: for j in range(2):
...: xy[i,j] = xx[i]*xx[j]
...:
In [7]: xy
Out[7]:
array([[x**4, x**2*y],
[x**2*y, y**2]], dtype=object)
</code></pre>
<p>或者一种创建相同内容的列表理解方式</p>
<pre><code>In [8]: [[i*j for j in xx] for i in xx]
Out[8]:
⎡⎡ 4 2 ⎤ ⎡ 2 2⎤⎤
⎣⎣x , x ⋅y⎦, ⎣x ⋅y, y ⎦⎦
</code></pre>
<p>作为嵌套列表,然后像以前一样排列:</p>
<pre><code>In [9]: np.array(_)
Out[9]:
array([[x**4, x**2*y],
[x**2*y, y**2]], dtype=object)
</code></pre>
<p>对象数据类型数组经常出现在SO问题上,但通常是在创建“不规则”数组时。它们没有数字数据类型数组的速度和计算能力</p>
<p>只要元素本身实现了正确的方法(如加法),一些基本数学就可以处理对象数据类型数组</p>
<pre><code>In [10]: xy.sum(axis=1)
Out[10]: array([x**4 + x**2*y, x**2*y + y**2], dtype=object)
In [11]: np.exp(xy)
...
TypeError: loop of ufunc does not support argument 0 of type Pow which has no callable exp method
</code></pre>
<p>(没有人实现<code>exp</code>方法。)</p>
<p><code>sympy</code>在<code>python</code>中运行,因此元组和列表等基本python结构是自然的。与<code>numpy</code>的交互是命中或未命中的,而且速度从来没有纯数字数组快<code>sympy's</code>自己的矩阵/数组导入通常会给您更多的功能,但需要更多的研究</p>
<p>另一个答案中给出的<code>sympy.Matrix</code>对象:</p>
<pre><code>In [20]: zz = zeros(2,2)
In [21]: for i in range(2):
...: for j in range(2):
...: zz[i,j] = xx[i]*xx[j]
...:
In [22]: zz
Out[22]:
⎡ 4 2 ⎤
⎢ x x ⋅y⎥
⎢ ⎥
⎢ 2 2 ⎥
⎣x ⋅y y ⎦
</code></pre>
<p>也可以从嵌套列表中构造:</p>
<pre><code>In [23]: Matrix(Out[8])
Out[23]:
⎡ 4 2 ⎤
⎢ x x ⋅y⎥
⎢ ⎥
⎢ 2 2 ⎥
⎣x ⋅y y ⎦
</code></pre>