我试图找到由一个特定类(decimal.Decimal
)组成的矩阵的逆矩阵,并在整个过程中将值保持为十进制对象(在整个计算过程中保持精确性)。在
我的问题是numpy.linalg.inverse
总是以浮点形式返回矩阵值。我已经找到了一个解决办法,在计算逆数后,将类型从float改为Decimal对象,但我更希望始终保持原始矩阵的类(我担心当数字转换为float时,我可能会失去准确性)?在
所以我想我有几个问题:(1)当矩阵的值被转换成float类型时,我是否会失去准确性/精确性(我正在处理一个11乘11的矩阵);如果是这样,(2)在整个计算过程中使用numpy
保持这些值为decimal.Decimal
;如果不是,那么(3)对于这种类型,是否还有其他模块/方法需要考虑计算的结果?在
下面是我的代码的示例:
import numpy as np
from decimal import Decimal as D
a = np.array( [ [D('1'), D('2'), D('3')],
[D('4'), D('5'), D('6')],
[D('7'), D('8'), D('9')] ] )
print type(a[0,0])
# <class 'decimal.Decimal'>
inverse_a = np.linalg.inv(a)
print type(inverse_a[0,0])
# <type 'numpy.float64'>
inverse_a_Decimal_flat = [D(str(i)) for i in inverse_a.flat] # change all values to decimal.Decimal
inverse_a_Decimal = np.reshape(inverse_a_Decimal_flat, [3, 3]) # reshape to 3x3
print type(inverse_a_Decimal[0,0]), d.shape
# <class 'decimal.Decimal'> (3,3)
您的
a
是一个对象数组:在我最新更新的
^{pr2}$numpy
中,我在尝试逆操作时遇到了一个错误。在inv
可能正在使用编译代码(_umath_linalg.inv
),它将被编码为与标准的c
浮点(float或double)一起工作。在您询问了
longdouble
:同样,这是一个如何编译
linalg
的问题。在我试图
dot
这个,但没有得到预期的np.eye
数组。但这是一个几乎是奇异的数组(行列式是0,或者差不多)。在所以这是个坏例子。在
将值洗牌到数组不再是单数
如果}。我可以用
a1
是np.int
,我也会得到同样的结果,因为np.int
被上推到{np.float32
进行测试,以查看较低精度的效果。如前所述,我不能去longfloat
。在inv
通常计算为I/a1
线性方程解:使用^{} 是否可以接受?在
如果我们用它:
我们意识到,颠倒这个矩阵是没有意义的!在
再次尝试用10来交换9,得到
^{pr2}$这是期望的无限精度结果。在
相关问题 更多 >
编程相关推荐