如何正确地将 mpmath 矩阵转换为 numpy ndarray(和 mpmath.mpf 以浮动)
How to properly cast mpmath matrix to numpy ndarray ( and mpmath.mpf to float)
我正在使用 mpmath python 库在某些计算中获得精度,但我需要将结果转换为 numpy 本机类型。
更准确地说,我需要在 numpy.ndarray(包含浮点类型)中转换一个 mpmath 矩阵(包含 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
我的问题是:
有better/moreelegant/easier/clever的方法吗?
更新:
反复阅读 mpmath 文档我发现这个非常有用的方法:tolist(),它可以按如下方式使用:
Z = np.array(matr.tolist(),dtype=np.float32)
它看起来稍微好一点和优雅(不需要 for 循环)
有更好的方法吗?我的第二个解决方案是四舍五入还是砍掉多余的数字?
你的第二种方法是首选,但使用 np.float32 意味着将数字转换为单精度。对于您的矩阵,此精度太低:115.80200375 由于截断而变为 115.80200195。您可以使用 numpy.float64 显式设置双精度,或者只将 Python 的 float
类型作为参数传递,这意味着相同。
Z = numpy.array(matr.tolist(), dtype=float)
或者,为了保持矩阵结构,
Z = numpy.matrix(matr.tolist(), dtype=float)
我正在使用 mpmath python 库在某些计算中获得精度,但我需要将结果转换为 numpy 本机类型。
更准确地说,我需要在 numpy.ndarray(包含浮点类型)中转换一个 mpmath 矩阵(包含 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
我的问题是:
有better/moreelegant/easier/clever的方法吗?
更新:
反复阅读 mpmath 文档我发现这个非常有用的方法:tolist(),它可以按如下方式使用:
Z = np.array(matr.tolist(),dtype=np.float32)
它看起来稍微好一点和优雅(不需要 for 循环)
有更好的方法吗?我的第二个解决方案是四舍五入还是砍掉多余的数字?
你的第二种方法是首选,但使用 np.float32 意味着将数字转换为单精度。对于您的矩阵,此精度太低:115.80200375 由于截断而变为 115.80200195。您可以使用 numpy.float64 显式设置双精度,或者只将 Python 的 float
类型作为参数传递,这意味着相同。
Z = numpy.array(matr.tolist(), dtype=float)
或者,为了保持矩阵结构,
Z = numpy.matrix(matr.tolist(), dtype=float)