我在Python中有以下高斯方程:
numpy.exp((-(x-m)**2)/(2*sigma))
前提是x
是矩阵。
然而,这个等式不会运行,我得到以下错误:
AttributeError: 'Float' object has no attribute 'exp'
我该如何解决这个问题?
修改-1
进行以下编辑:
map(float(),np.exp((-(x-m)**2)/(2*sigma)))
提出错误:
TypeError: 'float' object is not callable
修改-2
这是值x
:
[[-0.20646505 0.07763347 -0.16161097 0.370439 ]
[-0.91295327 -0.73768934 -0.78909055 0.06156045]
[-0.37242104 0.51828245 -1.16138222 -0.02489585]
[-1.07890926 -0.29704036 -1.7888618 -0.3337744 ]]
m = 5
sigma = 1
感谢。
答案 0 :(得分:6)
这可能是因为您将数组的dtype作为对象,因此将其转换为float即
x = np.array([[-0.20646505, 0.07763347, -0.16161097, 0.370439 ],
[-0.91295327,-0.73768934, -0.78909055, 0.06156045],
[-0.37242104, 0.51828245, -1.16138222, -0.02489585],
[-1.07890926, -0.29704036, -1.7888618, -0.3337744 ]],dtype=object)
m = 5
sigma = 1
np.exp((-(x-m)**2)/(2*sigma))
这将导致:
AttributeError: 'float' object has no attribute 'exp'
将其转换为float,即:
np.exp((-(x.astype(float)-m)**2)/(2*sigma))
array([[ 1.29935943e-06, 5.47758566e-06, 1.63950875e-06,
2.21778276e-05],
[ 2.55786406e-08, 7.10033001e-08, 5.27984133e-08,
5.06026050e-06],
[ 5.40131118e-07, 4.34936286e-05, 5.70846640e-09,
3.28945338e-06],
[ 9.45644899e-09, 8.07503629e-07, 9.81698210e-11,
6.64271640e-07]])
这还取决于您使用的numpy版本。您还应该尝试更新numpy,因此修复了很多错误。
答案 1 :(得分:0)
使用python 3而不是2!
由于anaconda环境或其他代码是正确的,这一定是个问题,只需使用python3.x!
答案 2 :(得分:0)
map(float(),np.exp((-(x-m)**2)/(2*sigma)))
map
接受一个函数和一个迭代。 float
是一个函数,float()
是将其应用于任何内容的结果
In [173]: float()
Out[173]: 0.0
因此抱怨浮动不是可赎回的。这不是一个功能。
正确使用map
和float
是:
In [175]: list(map(float, [1,2,3]))
Out[175]: [1.0, 2.0, 3.0]
第二个参数是你已经遇到问题的表达式。如果x
在原始版本中不起作用,则无法在此调用中使用。
np.exp
应用于对象dtype数组,尝试将操作委托给数组的每个对象。
In [174]: np.exp(np.array([[1,2],3,4]))
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-174-82d2b5b40b53> in <module>()
----> 1 np.exp(np.array([[1,2],3,4]))
AttributeError: 'list' object has no attribute 'exp'
但大多数对象没有exp
方法。
原始问题的关键是理解为什么x
是对象dtype数组。为什么不是浮点数组?它是如何构建的?
在另一个答案中,将对象数组转换为float数组的解决方案适用于这种情况,但可能不适用于更通用的对象数组。
x
表达式的其余部分适用于对象dtype数组。一般来说,对象dtype数组的数学是iffy - 为某些东西而不是为其他人工作。它将任务委托给每个元素,因此-
和**
等基本操作符可以正常工作。但即使它工作也很慢。
In [177]: x =np.random.random((4,2))
In [178]: (-(x-m)**2)/(2*sigma)
Out[178]:
array([[ -8.07952334, -8.15537868],
[-10.37197226, -10.27704074],
[-11.57978784, -11.18915471],
[-10.39579226, -10.8018881 ]])
In [179]: (-(x.astype(object)-m)**2)/(2*sigma)
Out[179]:
array([[-8.079523343837689, -8.155378680249662],
[-10.371972261358971, -10.277040739722857],
[-11.579787836524062, -11.189154714963014],
[-10.395792264129886, -10.80188810039029]], dtype=object)
In [180]: np.exp((-(x.astype(object)-m)**2)/(2*sigma))
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-180-e040a450f8e2> in <module>()
----> 1 np.exp((-(x.astype(object)-m)**2)/(2*sigma))
AttributeError: 'float' object has no attribute 'exp'