在numexpr中自动float32升级

时间:2012-06-05 21:31:20

标签: python numpy pytables numexpr

考虑下面的dtype float32的NumPy数组:

In [29]: x = numpy.arange(10, dtype=numpy.float32)

当我使用2将其乘以pytables.Expr时,我得到一个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)。我该怎么做?

1 个答案:

答案 0 :(得分:1)

我非常确定pytables.Expr基于Numexpr。 Numexpr的文档注释了以下有关表达式升级的内容:

  

在暗示标量和数组的操作中,正常的规则   在Numexpr中使用了转换,而NumPy则使用了数组类型   优先考虑。例如,如果'a'是float32和float类型的数组   'b'是float64类型的标量(或Python浮点类型,它是   等价),然后'a * b'在Numexpr中返回一个float64,但是在一个float32中   NumPy(即数组操作数优先于确定结果   类型)。如果你需要保持结果为float32,请确保使用a   float32标量也是。

所以这可能是正在发生的事情。浮点常量负责升级到64位浮点数,解决方案是将浮点常量显式指定为float32。