Python中Numpy与MpMath的互操作性

11 投票
2 回答
8731 浏览
提问于 2025-04-17 20:25

我有一个包含高精度数字的numpy数组A,这些数字的精度是100位小数。如果我把这个数组A和它自己做点积运算,这个精度会不会丢失呢?

如果会丢失,有没有办法把numpy数组转换成mpmath矩阵,这样我就可以保持这个精度呢?

2 个回答

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)
17

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。所以,当在第一个版本中调用dot方法时,mpmath提供的更高精度得以保留。

撰写回答