<p>您的<code>a</code>是一个对象数组:</p>
<pre><code>In [255]: a
Out[255]:
array([[Decimal('1'), Decimal('2'), Decimal('3')],
[Decimal('4'), Decimal('5'), Decimal('6')],
[Decimal('7'), Decimal('8'), Decimal('9')]], dtype=object)
</code></pre>
<p>在我最新更新的<code>numpy</code>中,我在尝试逆操作时遇到了一个错误。在</p>
^{pr2}$
<p><code>inv</code>可能正在使用编译代码(<code>_umath_linalg.inv</code>),它将被编码为与标准的<code>c</code>浮点(float或double)一起工作。在</p>
<p>您询问了<code>longdouble</code>:</p>
<pre><code>In [266]: a1=np.arange(1,10,dtype=np.longdouble).reshape(3,3)
In [267]: a1
Out[267]:
array([[ 1.0, 2.0, 3.0],
[ 4.0, 5.0, 6.0],
[ 7.0, 8.0, 9.0]], dtype=float96)
In [268]: np.linalg.inv(a1)
...
TypeError: array type float96 is unsupported in linalg
</code></pre>
<p>同样,这是一个如何编译<code>linalg</code>的问题。在</p>
<pre><code>In [269]: a1=np.arange(1,10,dtype=np.double).reshape(3,3)
In [270]: np.linalg.inv(a1)
Out[270]:
array([[ 3.15221191e+15, -6.30442381e+15, 3.15221191e+15],
[ -6.30442381e+15, 1.26088476e+16, -6.30442381e+15],
[ 3.15221191e+15, -6.30442381e+15, 3.15221191e+15]])
</code></pre>
<p>我试图<code>dot</code>这个,但没有得到预期的<code>np.eye</code>数组。但这是一个几乎是奇异的数组(行列式是0,或者差不多)。在</p>
<pre><code>In [274]: np.linalg.det(a1)
Out[274]: -9.5171266700777698e-16
</code></pre>
<p>所以这是个坏例子。在</p>
<p>将值洗牌到数组不再是单数</p>
<pre><code>In [288]: a1=np.array([[3,1,2],[4,6,5],[8,9,7]],np.float)
In [289]: a1.dot(np.linalg.inv(a1))
Out[289]:
array([[ 1.00000000e+00, 0.00000000e+00, 2.22044605e-16],
[ -4.44089210e-16, 1.00000000e+00, 4.44089210e-16],
[ 0.00000000e+00, 0.00000000e+00, 1.00000000e+00]])
</code></pre>
<p>如果<code>a1</code>是<code>np.int</code>,我也会得到同样的结果,因为<code>np.int</code>被上推到{<cd13>}。我可以用<code>np.float32</code>进行测试,以查看较低精度的效果。如前所述,我不能去<code>longfloat</code>。在</p>
<p><code>inv</code>通常计算为<code>I/a1</code>线性方程解:</p>
<pre><code>In [297]: np.linalg.solve(a1,np.eye(3))
Out[297]:
array([[ 0.14285714, -0.52380952, 0.33333333],
[-0.57142857, -0.23809524, 0.33333333],
[ 0.57142857, 0.9047619 , -0.66666667]])
In [298]: np.linalg.inv(a1)
Out[298]:
array([[ 0.14285714, -0.52380952, 0.33333333],
[-0.57142857, -0.23809524, 0.33333333],
[ 0.57142857, 0.9047619 , -0.66666667]])
</code></pre>