1

考虑以下 dtype 的 NumPy 数组float32

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

当我将它乘以2usingpytables.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)。我该怎么做呢?

4

1 回答 1

1

我很确定它pytables.Expr是基于Numexpr. Numexpr 的文档对表达式中的提升进行了以下说明:

在隐含标量和数组的操作中,在 Numexpr 中使用正常的转换规则,而在 NumPy 中,数组类型优先。例如,如果 'a' 是 float32 类型的数组,而 'b' 是 float64 类型的标量(或 Python 浮点类型,等效),则 'a*b' 在 Numexpr 中返回 float64,但在NumPy(即数组操作数优先确定结果类型)。如果您需要将结果保留为 float32,请确保也使用 float32 标量。

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

于 2012-06-06T10:16:05.567 回答