2013-09-16 5 views
7

私のように、生成し、プロット「超ガウス」機能するためにPythonのコードを書いている:コードに続いてはAttributeErrorは

def supergaussian(x, A, mu, sigma, offset, N=8): 
    """Supergaussian function, amplitude A, centroid mu, st dev sigma, exponent N, with constant offset""" 
    return A * (1/(2**(1+1/N)*sigma*2*scipy.special.gamma(1+1/N))) * numpy.exp(-numpy.absolute(numpy.power(x-mu,N))/(2*sigma**N)) + offset 

init_x = numpy.arange(-100,100,1.0) 
init_y = supergaussian(init_x, 1, 0, 25, 0, N=12) 

はちょうどそれをプロットします。

AttributeError: 'float' object has no attribute 'exp' 
Nため8のデフォルト値を使用して、または Nが14以上である場合 N最大13の値に対して、関数はエラーメッセージでクラッシュしたときに、私は測深することができないため、このコードは正常に動作し

関数定義の戻り行にあります。何か案は?だけNの値が大きいため、エラーメッセージがnumpyがfloatとして解釈されていることを暗示しているようだnumpy.expある.EXP使用しているラインで唯一のもの...

以来、私は、Python 3.3を実行していますよ。 2とnumpy 1.7.1とscipy 0.12.0

答えて

14

このエラーはnumpyのdtypeの奇妙さに起因します。私はそれが内部で動作します正確にどのようにわからないんだけど、何らかの理由で2*25**14がnumpyのは、データ型の処理方法の変更トリガ:13で

>>> type(np.max(-numpy.absolute(numpy.power(init_x-0,13)))/(2*25**13)) 
<type 'numpy.float64'> 
>>> type(np.max(-numpy.absolute(numpy.power(init_x-0,14)))/(2*25**14)) 
<type 'float'> 

を、それはまだnumpyのののfloat64タイプを使用しますが、14でそれは何とか戻ります通常のフロートに。これがAttributeErrorを取得する理由です。通常のPython浮動小数点数はnum35のufuncメソッドであるexpメソッドを持っていません。 (エラーは名前numpyがフロートとして解釈されているわけではありません。時には、これらのnumpy内部エラーは、そのオブジェクトが属性を持たないオブジェクトを教えてくれないという点で役に立たないことがあります)。

ただし、これは、数字2*25**Nが通常のPythonのlong型であり、numpyのデータ型の値ではないために起こります。あなたはこのように、numpyのDTYPEにその値を事前にラップすることにより、それを修正することができます:

def supergaussian(x, A, mu, sigma, offset, N=8): 
    """Supergaussian function, amplitude A, centroid mu, st dev sigma, exponent N, with constant offset""" 
    denom = np.float64(2*sigma**N) 
    return A * (1/(2**(1+1/N)*sigma*2*scipy.special.gamma(1+1/N))) * numpy.exp(-numpy.absolute(numpy.power(x-mu,N))/denom) + offset 

は、今では大きな値のために正常に動作します。

変換の失敗は、2*25**14が大きすぎてnumpyのint64に収まらないためです。これは私にはバグのようです:もしそれがint64には大きすぎるならば、それはfloat64に落ちるか、エラーを起こして、静かに普通のフロートに戻らなくてはなりません。 numpy trackerに関連するバグがあるようですが、それは少し違って見えます。 numpyトラッカーやメーリングリストで問題を提起したいかもしれません。

+0

ありがとう、これはまさに起こっていることです。私はぬるぬるトラッカーに提出する。 –

関連する問題