【问题标题】:Numpy Standard Deviation AttributeError: 'Float' object has no attribute 'sqrt'Numpy 标准偏差 AttributeError:'Float' 对象没有属性'sqrt'
【发布时间】:2018-07-31 15:38:59
【问题描述】:

我知道这被问了很多次,但是,我仍然遇到以下问题。我为 mean 和 stdev 定义了自己的函数,但 stdev 计算 std(Wapproxlist) 的时间太长。所以,我需要解决这个问题。

import numpy as np
def Taylor_Integration(a, b, mu):
    import sympy as sy
    A, B, rho = sy.symbols('A B rho', real=True)
    Wapp = (A + B*rho - rho/(2*mu*(1 - rho)))**2
    eq1 = sy.diff(sy.integrate(Wapp, (rho, a, b)),A)
    eq2 = sy.diff(sy.integrate(Wapp, (rho, a, b)),B)
    sol = sy.solve([eq1,eq2], [A,B])
    return sol[A], sol[B]

def Wapprox(rho, A, B):
    return A + B*rho

def W(mu, rho):
    return rho/(2*mu*(1-rho))

Wapproxlist = []
Wlist = []
alist = np.linspace(0, 0.98, 10)

for a in alist:
    b = a+0.01; mu = 1
    A, B = Taylor_Integration(a, b, mu)
    rholist = np.linspace(a, b, 100)
    for rho in rholist:
        Wapproxlist.append(Wapprox(rho, A, B))
        Wlist.append(W(mu, rho))

print('mean=%.3f stdv=%.3f' % (np.mean(Wapproxlist), np.std(Wapproxlist)))
print('mean=%.3f stdv=%.3f' % (np.mean(Wlist), np.std(Wlist)))

输出:

AttributeError                            Traceback (most recent call last)
<ipython-input-83-468c8e1a9f89> in <module>()
----> 1 print('mean=%.3f stdv=%.3f' % (np.mean(Wapproxlist), np.std(Wapproxlist)))
      2 print('mean=%.3f stdv=%.3f' % (np.mean(Wlist), np.std(Wlist)))

C:\Users\2tc\.julia\v0.6\Conda\deps\usr\lib\site-packages\numpy\core\fromnumeric.pyc in std(a, axis, dtype, out, ddof, keepdims)
   3073 
   3074     return _methods._std(a, axis=axis, dtype=dtype, out=out, ddof=ddof,
-> 3075                          **kwargs)
   3076 
   3077 

C:\Users\2tc\.julia\v0.6\Conda\deps\usr\lib\site-packages\numpy\core\_methods.pyc in _std(a, axis, dtype, out, ddof, keepdims)
    140         ret = ret.dtype.type(um.sqrt(ret))
    141     else:
--> 142         ret = um.sqrt(ret)
    143 
    144     return ret

AttributeError: 'Float' object has no attribute 'sqrt'

【问题讨论】:

    标签: python python-2.7 numpy


    【解决方案1】:

    numpy 不知道如何处理sympyFloat 类型。

    (Pdb) type(Wapproxlist[0])
    <class 'sympy.core.numbers.Float'>
    

    在调用 np.meannp.std 之前将其转换为 numpy 数组。

    Wapproxlist = np.array(Wapproxlist, dtype=np.float64) # can use np.float32 as well
    
    print('mean=%.3f stdv=%.3f' % (np.mean(Wapproxlist), np.std(Wapproxlist)))
    print('mean=%.3f stdv=%.3f' % (np.mean(Wlist), np.std(Wlist)))
    

    输出:

    mean=4.177 stdv=10.283
    mean=4.180 stdv=10.300
    

    注意:如果您希望加快速度,请避免使用sympy。符号求解器非常酷,但与浮点计算相比它们也很慢。

    【讨论】:

      猜你喜欢
      • 2013-09-04
      • 2018-10-02
      • 2020-03-01
      • 1970-01-01
      • 2019-07-07
      • 2017-07-02
      • 2016-04-15
      • 2020-01-11
      • 1970-01-01
      相关资源
      最近更新 更多