27

実験データをそれに適合させるために使用できる数学関数を返す単純な関数を設計しました。関数は次のようになります。

def colecole_2(f,*p):
    term1=p[0] * ( 1 - 1 / (1 + numpy.power((0+1j) * 2 * numpy.pi * f * p[1], p[2])))
    term2=p[3] * ( 1 - 1 / (1 + numpy.power((0+1j) * 2 * numpy.pi * f * p[4], p[5])))
    return p[6]*(1-abs( term1+ term2))

残念ながら、次のように RunTimeWarnings で問題が発生します。

RuntimeWarning: overflow encountered in power
RuntimeWarning: overflow encountered in divide

値が大きすぎるか小さすぎるためです。ただし、この問題を自分で理解することはできません。関数を再定義して、警告なしで渡す方法はありますか?

4

3 に答える 3

52

組み込みのコンテキストマネージャーであるnumpy.errstateを使用できます。これにより、エラー処理を with ステートメントのコンテキスト内に設定できます。

import numpy
# warning is not logged here. Perfect for clean unit test output
with numpy.errstate(divide='ignore'):
    numpy.float64(1.0) / 0.0

最近、一部のレガシー python コードの単体テストを作成するときに、これを行う必要がありました。

于 2013-02-11T22:46:58.820 に答える
24

numpy.seterrこの状況で numpy が何をするかを制御するために使用します: http://docs.scipy.org/doc/numpy/reference/generated/numpy.seterr.html

warnings モジュールを使用して、警告を表示する方法と表示しない方法を制御します: http://docs.python.org/library/warnings.html

于 2012-05-09T15:52:13.423 に答える
5

これを回避するには、関数を呼び出す配列要素の型を変更して精度を上げることができます。

たとえば、要素として大きな数値を持つ配列aに大きな浮動小数点数を掛けると、例外が発生する場合

RuntimeWarning: overflow encountered in multiply

次に、次を指定すると

a = np.array(a, dtype=np.float128)

警告は発生しません。

于 2015-09-11T10:59:47.697 に答える