我有一个包含mpf元素的numpy数组A,其小数精度为100。如果我决定用numpy将A与自身进行点积运算,这个精度是否会丢失?
如果是这样的话,有没有办法将numpy数组转换为mpmath矩阵,以保留精度?
mpf
对象,它们的方法如dot
可以使用这些对象的加法/乘法方法。例如:import mpmath
import numpy
mpmath.mp.dps = 25 # higher precision for demonstration
a = [mpmath.sin(mpmath.pi*n/3) for n in range(99)]
b = numpy.array(a)
b.dot(b)
输出 mpf('49.50000000000000000000000165')
为了比较,当转换为numpy时,如果数组元素被强制转换为双精度浮点数,会发生什么:
c = numpy.array(a, dtype=float)
c.dot(c)
输出结果为49.499999999999993
。因此,当在第一个版本中调用点方法时,mpmath提供的更高精度得以保留。
import mpmath as mp, numpy as np
N = 5
L = np.ones(N)
M = np.diag(L, 2) # A numpy matrix 7x7
# Notes that MPMath "diag" function is limited to one parameter only
M = mp.matrix(M.tolist())
print(type(M),'\n', M)
fractions.Fraction
实例的数组进行测试时,dot
运行良好,因此它可能会调用适当的mpmath
方法而不尝试转换为numpy浮点数。我建议你试试。 - user2357112