我正在使用mpmath python库在某些计算过程中提高精度,但是我需要将结果强制转换为numpy native 类型。

更确切地说,我需要在numpy.ndarray(包含浮点类型)中强制转换mmpath矩阵(包含mpf对象类型)。

我已经用一种原始的方法解决了这个问题:

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

似乎稍微好点又优雅(不需要循环)

有更好的方法吗?我的第二个解决方案会舍入或砍掉多余的数字吗?

最佳答案

第二种方法是首选,但是使用np.float32意味着将数字强制转换为单精度。对于矩阵,此精度太低:由于被截断,因此115.80200375变为115.80200195。您可以使用numpy.float64显式设置 double ,或仅将Python的float类型作为参数传递,这意味着相同。

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

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

关于python - 如何正确地将Mpmath矩阵强制转换为numpy ndarray(并使mpmath.mpf float ),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28446555/

10-12 05:31