Python中Numpy和MpMath之间的互操作性

11

我有一个包含mpf元素的numpy数组A,其小数精度为100。如果我决定用numpy将A与自身进行点积运算,这个精度是否会丢失?

如果是这样的话,有没有办法将numpy数组转换为mpmath矩阵,以保留精度?


2
我怀疑这不会引起问题。当我使用充满fractions.Fraction实例的数组进行测试时,dot运行良好,因此它可能会调用适当的mpmath方法而不尝试转换为numpy浮点数。我建议你试试。 - user2357112
谢谢 :) 我一直在尝试寻找关于哪些numpy操作与mpmath兼容的文档,但是到目前为止还没有找到 :( - Jing
2个回答

16
Numpy数组可以容纳对象,特别是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提供的更高精度得以保留。


2
之前的回答是正确的。然而,有时候在numpy中能够正常工作的东西,在mpmath中却不能(至少是以不同的方式完成)。因此,原始的(通用的)问题为:
“...是否有任何方法将numpy数组转换为mpmath矩阵,以便我可以保持精度?..”
根据我的经验,这个(更通用的)问题仍需要一个通用的答案。解决这个问题的其中一种方法是首先将numpy数组转换为列表,然后再将列表转换为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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接