Python:AttributeError:“属性错误”';numpy.float64';对象没有属性';tanh'&引用;

Python:AttributeError:“属性错误”';numpy.float64';对象没有属性';tanh'&引用;,numpy,multidimensional-array,Numpy,Multidimensional Array,我见过两个标题类似的问题,但我担心,没有一个能令人满意地回答我的问题,那就是,我如何取谭的倒数,或者说一个numpy的经验?例如,我的一段代码与此类似- 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 basica

我见过两个标题类似的问题,但我担心,没有一个能令人满意地回答我的问题,那就是,我如何取谭的倒数,或者说一个numpy的经验?例如,我的一段代码与此类似-

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)

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

In [89]: a=np.array([[1],[3],[2]],dtype=np.ndarray)
In [90]: a
Out[90]: 
array([[1],
       [3],
       [2]], dtype=object)
请注意,
dtype
object
,而不是
ndarray
。如果
dtype
不是可识别的数字或字符串类型之一,则它是
object
,一个通用指针,就像列表中的元素一样

In [91]: np.tanh(a)

AttributeError: 'int' object has no attribute 'tanh'
np.tanh
正在尝试将任务委托给数组的元素。通常,对象数据类型数组的数学运算是通过元素上类似列表的迭代来执行的。它不做快速编译的数值计算

如果
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),只包含一个数字。因此可以将其初始化为普通二维浮点数组:

z_g=np.zeros((m,n))
θ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\u g
元素只有7-11个长度,所以在这里不太节省时间。但是更干净


在这个运行的代码中,我没有看到一个
tanh
,所以我不知道什么类型的数组正在使用它。

“…我需要将整个列表分配给我的numpy矩阵(数组)的每个元素”这是不可能的。请展示您想要实现的目标,我们可以展示实现目标的最佳方式。这绝对不是你想做的。@AGNGazer我已经编辑了我的文章,请看一看。问题在于函数zetta_F、zetta_G和F()中,我试图用数组和列表填充一个3x3 dim的空矩阵。这是要求。我认为你所有的代码都太大,信息量太少。您应该提供一个最小的示例-请参阅。请看我编辑的答案,特别是
a[0]=[1,2,3,4]
-这就是您要做的吗?您好@AGNGazer,我编辑了我的代码以提供一个最小的示例。请再看一看。嗨@hpaulj!我已经用我的最小版本的工作示例修改了我的帖子。我面临的唯一问题是在if main的最后一行中,那就是我正在使用tanh的地方。请看,我已经使代码变得简单易读。感谢编辑您的代码,是的,z_g应该是一个包含单个数字的矩阵,但是θ_g是一个维度类似于z_g的矩阵,但是θ_g的各个元素不仅仅是数字,而是长度不同的列表,如您上面所示,即(1331,),。。。。(343,)etcI希望以后能在我的代码中使用z_g的倒数。对于倒数,必须使用数值
z_g