如何正确将mpmath矩阵转换为numpy ndarray(以及mpmath.mpf转换为float)

6
我正在使用mpmath Python库进行一些计算以获得更高的精度,但我需要将结果转换为numpy本地类型。
更具体地说,我需要将包含mpf对象类型的mpmath矩阵转换为包含float类型的numpy.ndarray。
我已经通过一种原始方法解决了这个问题。
# My input Matrix:

matr = mp.matrix(
[[ '115.80200375',  '22.80402473',   '13.69453064',   '54.28049263'],
[  '22.80402473',   '86.14887381',   '53.79999432',   '42.78548627'],
[  '13.69453064',   '53.79999432',  '110.9695448' ,   '37.24270321'],
[  '54.28049263',   '42.78548627',   '37.24270321',   '95.79388469']])

# multiple precision computation
D = MPDBiteration(matr)

# Create a new ndarray  
Z = numpy.ndarray((matr.cols,matr.rows),dtype=numpy.float)

# I fill it pretty "manually"
for i in range(0,matr.rows):
    for j in range(0,matr.cols):
        Z[i,j] = D[i,j] # or float(D[i,j]) seems to work the same

我的问题是:

有没有更好/更优雅/更简单/更聪明的方法来做到这一点?

更新:

反复阅读 mpmath 文档后,我发现了这个非常有用的方法:tolist(),可以按以下方式使用:

 Z = np.array(matr.tolist(),dtype=np.float32)

看起来更好,更优雅(不需要for循环)

有更好的方法吗?我的第二个解决方案是否四舍五入或截断额外的数字?


tolist() 这个链接已经失效了。 - Tom
2个回答

4

你的第二种方法是更好的选择,但使用np.float32意味着将数字强制转换为单精度。对于您的矩阵,该精度太低:由于截断,115.80200375变为115.80200195。您可以使用numpy.float64明确设置双精度,或者只需将Python的float类型作为参数传递,这意味着相同。

Z = numpy.array(matr.tolist(), dtype=float)

或者,为了保持矩阵结构,
Z = numpy.matrix(matr.tolist(), dtype=float)

0

当对函数进行矢量化时(这通常是我们想要做的),您可以这样做。以下示例对θ函数进行了矢量化和转换。

import numpy as np
import mpmath as mpm

jtheta3_fn = lambda z,q: mpm.jtheta(n=3,z=z,q=q)
jtheta3_fn = np.vectorize(jtheta3_fn,otypes=(float,))

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