Python:AttributeError:"' numpy.float64'对象没有属性' tanh'"

时间:2018-02-09 04:36:27

标签: numpy multidimensional-array

我已经看到了几个类似标题的问题,但是我担心,没有一个问题可以令人满意地回答我的问题,那就是,我如何采取tan逆或者说一个numpy ndarray?例如,我的代码片段看起来与此相似 -

import numpy as np
from numpy import ndarray,zeros,array,dot,exp
import itertools

def zetta_G(x,spr_g,theta_g,c_g):
#this function computes estimated g:

    #c_g is basically a matrix of dim equal to g and whose elements contains list of centers that describe the fuzzy system for each element of g:
    m,n=c_g.shape[0],c_g.shape[1]
    #creating an empty matrix of dim mxn to hold regressors:
    zetta_g=zeros((m,n),dtype=ndarray)
    #creating an empty matrix of dim mxn to hold estimated g:
    z_g=np.zeros((m,n),dtype=ndarray)
    #for filling rows
    for k in range(m):
        #for filling columns
        for p in range(n):
            #container to hold-length being equal to number of inputs(e1,e2,e3 etc)
            Mu=[[] for i in range(len(x))]
            for i in range(len(x)):
            #filling that with number of zeros equal to len of center
                Mu[i]=np.zeros(len(c_g[k][p]))
            #creating an empty list for holding rules
            M=[]
            #piece of code for creating rules-all possible combinations
            for i in range(len(x)):
                for j in range(len(c_g[k][p])):
                    Mu[i][j]=exp(-.5*((x[i]-c_g[k][p][j])/spr_g[k][p])**2)

            b=list(itertools.product(*Mu))
            for i in range(len(b)):
                M.append(reduce(lambda x,y:x*y,b[i]))

            M=np.array(M)
            S=np.sum(M)
            #import pdb;pdb.set_trace()
            zetta_g[k][p]=M/S
            z_g[k][p]=dot(M/S,theta_g[k][p])
    return zetta_g,z_g

if __name__=='__main__':
    x=[1.2,.2,.4]
    cg11,cg12,cg13,cg21,cg22,cg23,cg31,cg32,cg33=[-10,-8,-6,-4,-2,0,2,4,6,8,10],[-10,-8,-6,-4,-2,0,2,4,6,8,10],[-10,-8,-6,-4,-2,0,2,4,6,8,10],[-10,-8,-6,-4,-2,0,2,4,6,8,10],[-10,-8,-6,-4,-2,0,2,4,6,8,10],[-12,-9,-6,-3,0,3,6,9,12],[-6.5,-4.5,-2.5,0,2.5,4.5,6.5],[-5,-4,-3,-2,-1,0,1,2,3,4,5],[-3.5,-2.5,-1.5,0,1.5,2.5,3.5]
    C,spr_f=array([[-10,-8,-6,-4,-2,0,2,4,6,8,10],[-10,-8,-6,-4,-2,0,2,4,6,8,10],[-10,-8,-6,-4,-2,0,2,4,6,8,10]]),[2.2,2,2.1]
    c_g=array([[cg11,cg12,cg13],[cg21,cg22,cg23],[cg31,cg32,cg33]])
    spr_g=array([[2,2.1,2],[2.1,2.2,3],[2.5,1,1.5]])
    theta_g=np.zeros((c_g.shape[0],c_g.shape[1]),dtype=ndarray)
    #import pdb;pdb.set_trace()
    N=0
    for i in range(c_g.shape[0]):
        for j in range(c_g.shape[1]):
            length=len(c_g[i][j])**len(x)
            theta_g[i][j]=np.random.sample(length)
            N=N+(len(c_g[i][j]))**len(x)
    zetta_g,z_g=zetta_G(x,spr_g,theta_g,c_g)
    #zetta is a function that accepts following args-- x: which is a list of certain dim, spr_g: is a matrix of dimension similar to theta_g and c_g. theta_g and c_g are numpy matrices with lists as individual elements
    print(zetta_g)
    print(z_g)
    inv=np.tanh(z_g)
    print(inv)

2 个答案:

答案 0 :(得分:1)

In [89]: a=np.array([[1],[3],[2]],dtype=np.ndarray)
In [90]: a
Out[90]: 
array([[1],
       [3],
       [2]], dtype=object)

请注意,dtypeobject,而不是ndarray。如果dtype不是已识别的数字或字符串类型之一,则它是object,一个通用指针,就像列表的元素一样。

In [91]: np.tanh(a)

AttributeError: 'int' object has no attribute 'tanh'

np.tanh正在尝试将任务委托给数组元素。通常,对象dtype数组的数学是通过列表来执行的,就像元素上的迭代一样。它没有进行快速编译的数字numpy数学。

如果a是普通数字数组:

In [95]: np.tanh(np.array([[1],[3],[2]]))
Out[95]: 
array([[0.76159416],
       [0.99505475],
       [0.96402758]])

使用object dtype数组,您进行数值计算的能力有限。有些事情有效,有些事情没有。它的命中与否。

这是第一次清理你的代码;它没有经过测试。

def zetta_G(x,spr_g,theta_g,c_g):
    m,n=c_g.shape[0],c_g.shape[1]
    #creating an empty matrix of dim mxn to hold regressors:
    zetta_g=zeros((m,n),dtype=object)
    #creating an empty matrix of dim mxn to hold estimated g:
    z_g=np.zeros((m,n),dtype=object)
    #for filling rows
    for k in range(m):
        #for filling columns
        for p in range(n):
            #container to hold-length being equal to number of inputs(e1,e2,e3 etc)

            Mu = np.zeros((len(x), len(c_g[k,p])))
            #creating an empty list for holding rules

            for i in range(len(x)):
                Mu[i,:]=exp(-.5*((x[i]-c_g[k,p,:])/spr_g[k,p])**2)
                # probably can calc Mu without any loop

            M = []
            b=list(itertools.product(*Mu))
            for i in range(len(b)):
                M.append(reduce(lambda x,y:x*y,b[i]))

            M=np.array(M)
            S=np.sum(M)

            zetta_g[k,p]=M/S
            z_g[k,p]=dot(M/S,theta_g[k,p])
    return zetta_g,z_g

运行代码并添加一些.shape显示我看到了

z_g是(3,3)并且只包含单个数字。所以它可以作为普通的2d浮点数组初始化:

z_g=np.zeros((m,n))

theta_g是(3,3),但是具有可变长度的数组元素

print([i.shape for i in theta_g.flat])
[(1331,), (1331,), (1331,), (1331,), (1331,), (729,), (343,), (1331,), (343,)]

zetta_g匹配形状

如果我改变:

x=np.array([1.2,.2,.4])

我可以在没有循环的情况下计算Mu

Mu = exp(-.5*((x[:,None]-np.array(c_g[k,p])[None,:])/spr_g[k,p])**2)

c_g是一个带有可变长度列表的(3,3)数组;我可以对

进行矢量化
((x[i]-c_g[k,p][j])

表达式:

x[:,None]-np.array(c_g[k,p])[None,:]

由于x有4个元素且c_g个元素只有7到11个元素,因此节省时间不是很大。但更干净。

在这个正在运行的代码中,我没有看到tanh,所以我不知道哪种阵列正在使用它。

答案 1 :(得分:0)

您将数组元素的类型设置为dtype=np.ndarray。将类型替换为dtype=np.float64或任何数字类型。