为某些值构造函数时python/numpy中的AttributeError

为某些值构造函数时python/numpy中的AttributeError,python,numpy,scipy,Python,Numpy,Scipy,我正在编写Python代码来生成和绘制“超高斯”函数,如下所示: 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

我正在编写Python代码来生成和绘制“超高斯”函数,如下所示:

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)
下面的代码只是它的一个绘图。出于我无法理解的原因,当使用
N
的默认值8,或
N
的值高达13时,此代码工作正常。当
N
为14或更高时,函数崩溃并显示错误消息:

AttributeError: 'float' object has no attribute 'exp'
在函数定义的返回行。有什么想法吗?由于该行中唯一使用.exp的是
numpy.exp
,因此错误消息似乎暗示
numpy
被解释为浮点,但仅适用于
N
的大值


我正在使用numpy 1.7.1和scipy 0.12.0运行python 3.3.2,这个错误是由于一些numpy数据类型的古怪。我不确定它在内部是如何工作的,但由于某种原因,
2*25**14
触发了Numpy处理数据类型的方式的变化:

>>> 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'>
现在,它可以很好地处理大值


转换失败似乎是由于
2*25**14
太大,无法装入numpy int64。对我来说,这看起来像一个bug:如果它对于int64来说太大,它应该退回到float64或引发错误,而不是静静地退回到普通float。看起来在上有一个相关的bug,但看起来略有不同。您可能希望在numpy tracker和/或邮件列表中提出此问题。

谢谢,这正是发生的情况。我将提交给numpy tracker。
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