3

问题:使用 numpy 设置所有标量和数组变量 的 dtype 的最简单方法是什么?

问题: 随着算法规模和复杂性的增长,由于舍入和截断错误,我发现跟踪收敛问题非常困难。我需要一种方法来自信地设置所有操作的精度,以消除那些微不足道的错误。

细节: 如研究部分所述,我主要很难弄清楚如何将标量的精度类型设置为可变(见下文)。即使我的数组具有可变 dtype,因为标量可能未明确设置为相同或更高精度的 dtype,但会发生向下转换,并且我在算法中不知不觉地失去了精度。

研究:

我可以将 float128 设置为 numpy 中的标准浮点数组吗? 这个问题给了我很好的建议;始终将数组 dtype 设置为变量,并在您的代码中将该变量定义为“numpy.float64”或任何您想要的。但是,如何为标量做到这一点?

无论输入类型如何,如何在 Python 中执行精确计算? 这个建议将我的标量映射到所需的输入。但是,有没有更清洁的方法?

我一直在做的是(感谢 Ophion 在下面的评论中):

import numpy as np
prec = np.float96

# a simple example of a scalar that might end up in my code
some_val = 5.0 - 3.99999999999999999992

# my current way of casting dtype of my scalars to the dtype of my arrays
myscalar = np.array(some_val, dtype=prec)

# the suggestion of using mapping:
myscalar = map(prec, (dt,))[0]
4

1 回答 1

1

由于以下效果很好:

>>> a=np.float128(5)
>>> a.dtype
dtype('float128')
>>> b=a-9
>>> b.dtype
dtype('float128')

编写一个可以为您转换它的简写定义可能是最简单的:

def quad(num):
    return np.float128(num)

或者

quad=np.float128

只是为了仔细检查:

>>> c=quad(5)-quad(4)
>>> c.dtype
dtype('float128')
>>> c
1.0

您正在创建一个零 d numpy 数组

>>> c.flags
  C_CONTIGUOUS : True
  F_CONTIGUOUS : True
  OWNDATA : True
  WRITEABLE : False
  ALIGNED : True
  UPDATEIFCOPY : False
>>> np.isscalar(c)
True
>>> c.shape
()
于 2013-08-16T01:52:12.843 回答