1

uncertainties.pyモジュール(エラー伝播を伴う計算を実行するモジュール)によって作成された数のようなオブジェクトに「すべての」数学関数を提供したいと思います。これらのオブジェクトは不確定性のある数です。

これを行うための最良の方法は何ですか?

math現在、モジュール内のほとんどの関数を再定義しuncertainties.pyて、不確実な数値で機能するようにしています。欠点の1つは、実行したいユーザーは実行from math import *に実行する必要があることです。import uncertainties

ただし、NumPyとの相互作用は、基本的な操作に制限されています(不確実性のある数値の配列を追加するなど)。不確実性のある数値を含むNumPy配列で機能する、より複雑な関数(sin()など)は(まだ)含まれていません。私がこれまでに採用したアプローチは、ユーザー定義を提案することで構成されていますsin = numpy.vectorize(math.sin)。これにより、新しいmath.sin関数(不確実性のある数値で機能する)が任意のNumpy配列の要素にブロードキャストされます。欠点の1つは、これをユーザーが関心のある機能ごとに実行する必要があることです。これは面倒です。

sin()では、単純な数値やNumPy配列で便利に機能するように、数学関数を拡張するための最良の方法は何でしょうか。

NumPyが選択したアプローチは、Numpy配列で機能するようにnumpy.sin変更するのではなく、独自のを定義することです。モジュールmath.sinに対して同じことを行い、再定義を停止する必要がありますか?uncertainties.pymath.sin

sinさらに、単純な数値、不確実性のある数値、およびNumpy配列の両方で機能するように、最も効率的で正しい定義方法は何でしょうか。私の再定義math.sinは、単純な数と不確実な数をすでに処理しています。ただし、を使用してベクトル化することnumpy.vectorizeは、「通常の」NumPy配列では。よりもはるかに遅い可能性がありますnumpy.sin

4

1 に答える 1

0

NumPy自体が行うことに従って、物事をクリーンに保つように見えます。新しいオブジェクトで機能する「拡張された」数学演算(sin…)は、別の名前空間に配置できます。したがって、NumPyにはnumpy.sinなどがあります。これらの操作は、からの操作とほとんど互換性mathがありますが、NumPy配列でも機能します。

したがって、通常の数値とNumPy配列機能するはずの数学関数と、不確実性のある対応する関数は、別の名前空間で定義するのが最適であるように思われます。たとえば、ユーザーは次のことを実行できます。

from uncertainties import sin

また

from uncertainties import *  # sin, cos, etc.

最適化の目的で、2つの異なる数学関数のセットを提供することもできます。関数を不確実性のある単純な数値に一般化するものと、関数を不確実性のある配列に一般化するものです。

from uncertainties.math_ops import *  # Work on scalars and scalars with uncertainty

また

from uncertainties.numpy_ops import *  # Work on everything (scalars, arrays, numbers with uncertainties, arrays with uncertainties)
于 2009-10-09T07:46:38.737 に答える