设置所有标量和数组的统一Numpy数据类型(如何避免精度下降)
问题: 使用numpy设置所有标量和数组变量的数据类型的最简单方法是什么 问题: 随着我的算法的规模和复杂性的增长,我发现由于舍入和截断错误,跟踪收敛问题非常困难。我需要一种方法来自信地设置所有操作的精度,以消除这些错误作为一个微不足道的原因 细节: 正如研究部分所指出的,我主要很难弄清楚如何将标量的精度类型设置为可变的(见下文)。即使我的数组有变量dtype,因为标量可能没有显式地设置为相同或更高精度的dtype,也会发生向下转换,我在算法中不知不觉地失去了精度 研究: 这个问题给了我很好的建议;始终将数组数据类型设置为一个变量,并在代码中将该变量定义为“numpy.float64”或任何您想要的变量。但是,如何处理标量呢 这一条建议将我的标量映射到所需的输入。但是,有没有更干净的方法 我一直在做的是(感谢Ophion在下面的评论):设置所有标量和数组的统一Numpy数据类型(如何避免精度下降),numpy,casting,floating-point,precision,scalar,Numpy,Casting,Floating Point,Precision,Scalar,问题: 使用numpy设置所有标量和数组变量的数据类型的最简单方法是什么 问题: 随着我的算法的规模和复杂性的增长,我发现由于舍入和截断错误,跟踪收敛问题非常困难。我需要一种方法来自信地设置所有操作的精度,以消除这些错误作为一个微不足道的原因 细节: 正如研究部分所指出的,我主要很难弄清楚如何将标量的精度类型设置为可变的(见下文)。即使我的数组有变量dtype,因为标量可能没有显式地设置为相同或更高精度的dtype,也会发生向下转换,我在算法中不知不觉地失去了精度 研究: 这个问题给了我很好的
由于以下方法效果良好:
>>> a=np.float128(5)
>>> a.dtype
dtype('float128')
>>> b=a-9
>>> b.dtype
dtype('float128')
可能最简单的方法是编写一个速记定义,将其转换为:
def quad(num):
return np.float128(num)
或
请仔细检查:
>>> c=quad(5)-quad(4)
>>> c.dtype
dtype('float128')
>>> c
1.0
您正在创建一个:
您可以通过
np.array(some_val,dtype=prec)
缩短选项2的标量的强制转换。甚至np.float128(some_val)
也可以工作!为了进一步减少这一点:dfloat=np.float128
,现在简单地dfloat(some_val)
将导致some_val
被转换为float128
@Ophion,我无法想象一个更简单的答案。请随便把它作为答案贴出来,我会接受的。
quad=np.float128
>>> c=quad(5)-quad(4)
>>> c.dtype
dtype('float128')
>>> c
1.0
>>> c.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : False
ALIGNED : True
UPDATEIFCOPY : False
>>> np.isscalar(c)
True
>>> c.shape
()