问题: 使用numpy设置所有标量和数组变量的dtype的最简单方法是什么?
问题: 随着算法的大小和复杂性的增长,我发现很难跟踪由于舍入和截断错误引起的收敛问题。我需要一种方法来自信地设置所有操作的精度,以消除这些错误,这是一个微不足道的原因。
具体细节: 如研究部分所示,我主要很难确定如何将标量的精确类型设置为可变(见下文)。即使我的数组具有变量dtype,因为标量可能没有被明确地设置为相同或更高精度的dtype,所以会发生向下转换,并且在我的算法中我不知不觉地失去了精度。
研究
Can i set float128 as the standard float-array in numpy 这个问题给了我很好的建议;总是将数组dtype设置为变量,并在您的代码中将该变量定义为“numpy.float64”或任何您想要的。但是,如何为标量做这个?
How to perform precise calculations in Python, regardless of input types? 这个建议将我的标量映射到所需的输入。但是,有更清洁的方式吗?
我一直在做的是(感谢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]
答案 0 :(得分: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
您正在创建zero-d numpy array:
>>> c.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : False
ALIGNED : True
UPDATEIFCOPY : False
>>> np.isscalar(c)
True
>>> c.shape
()