考虑以下dtype float32
的NumPy数组:
In [29]: x = numpy.arange(10, dtype=numpy.float32)
当我使用 pytables.Expr
将其乘以 2
时,我得到一个float32
数组:
In [30]: tables.Expr('x * 2').eval().dtype
Out[30]: dtype('float32')
然而,当我将其乘以 2.0
时,我得到一个float64
数组:
In [31]: tables.Expr('x * 2.0').eval().dtype
Out[31]: dtype('float64')
有没有办法在上述表达式中指定浮点文字,而不会导致结果提升为 float64
?
更一般地说,我有一个使用 float32
数组的表达式,我想确保结果也是 float32
类型(我不介意float64
用于中间计算,但我负担不起将结果存储为 float64
)。我该怎么做?
确定pytables.Expr
是基于Numexpr
的。Numexpr 的文档记录了有关表达式中提升的以下信息:
在暗示标量和数组的操作中,通常规则 在 Numexpr 中使用强制转换,与 NumPy 相反,其中数组类型 优先。例如,如果"a"是 float32 类型的数组,并且 'b' 是 float64 类型的标量(或 Python float 类型,即 等效),则 'a*b' 在 Numexpr 中返回一个 float64,但在 NumPy(即数组操作数优先确定结果 类型)。如果需要将结果保留为 float32,请确保使用 浮点32标量也是。
所以这可能就是正在发生的事情。浮点常量负责提升到 64 位浮点数,解决方案是显式指定浮点常量为 float32。