考虑下面的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
)。我该怎么做?
答案 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。