1

次のdtypeのNumPy配列について考えてみますfloat32

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

2を使用して乗算するとpytables.Exprfloat32配列が返されます。

In [30]: tables.Expr('x * 2').eval().dtype
Out[30]: dtype('float32')

しかし、これにを掛けると2.0float64配列が返されます。

In [31]: tables.Expr('x * 2.0').eval().dtype
Out[31]: dtype('float64')

結果がプロモートされないように、上記の式で浮動小数点リテラルを指定する方法はありますfloat64か?

より一般的には、float32配列を使用する式があり、結果も型であることを確認したいと思いますfloat32float64中間計算に使用してもかまいませんが、結果をとして保存する余裕はありませんfloat64)。どうすればよいですか?

4

1 に答える 1

1

pytables.Exprはに基づいているとかなり確信していNumexprます。Numexprのドキュメントには、式の昇格について次のように記載されています。

スカラーと配列を暗示する操作では、配列型が優先されるNumPyとは対照的に、Numexprでは通常のキャスト規則が使用されます。たとえば、「a」がfloat32型の配列で、「b」がfloat64型(または同等のPython float型)のスカラーである場合、「a * b」はNumexprではfloat64を返しますが、float32はNumPy(つまり、配列オペランドが結果タイプの決定に優先されます)。結果をfloat32のままにする必要がある場合は、float32スカラーも使用してください。

おそらくそれが起こっていることです。浮動小数点定数は64ビット浮動小数点数への昇格を担当します。解決策は、浮動小数点定数をfloat32として明示的に指定することです。

于 2012-06-06T10:16:05.567 に答える