【问题标题】:Plotting the output of a function gives this error-TypeError: unhashable type: 'numpy.ndarray'绘制函数的输出会给出此错误-TypeError: unhashable type: 'numpy.ndarray'
【发布时间】:2015-05-13 19:04:15
【问题描述】:

我试图绘制定义函数相对于 z 的输出。但是显示错误 TypeError: unhashable type: 'numpy.ndarray'。请帮忙。

import numpy as np
import matplotlib.pyplot as plt 
import sympy as sp

a=1.48185562
b=0.57081914
c=-0.25098188
H0=70.32724312

z=np.linspace(0.0,1.5,100)

omega_m0=0.3

dlabel= 'w(z) vz z'

def func(z):    
    sp.var('z+1')
    H=((2/H0)*((b*(z+1)+c*(z+1)**0.5+2.0-a-b-c)*(1-0.5*a*(z+1)**(-0.5)) - ((z+1)-a*(z+1)**0.5-1.0+a)*(b+c*0.5*(z+1)**(-0.5)))/(b*(z+1)+c*(z+1)**0.5+2.0-a-b-c)**2)**(-1) 
    return ((2*(z+1)/3)*(sp.diff(sp.log(H)))-1)/(1-(H/H0)**2*omega_m0*(z+1)**3)

wz=func(z)

plt.plot(z,wz)
plt.xlabel('z')
plt.ylabel('w(z)')
plt.show()

【问题讨论】:

    标签: python plot sympy


    【解决方案1】:

    我不确定你想用 sp.var('z+1') 做什么...至少我希望你没有试图创建一个名为 z+1 的变量。我让代码运行,但我让你确保它做你想做的事,如果没有就抱怨:)

    import numpy as np
    import matplotlib.pyplot as plt 
    import sympy as sp
    
    a=1.48185562
    b=0.57081914
    c=-0.25098188
    H0=70.32724312
    
    x=np.linspace(0.0,1.5,100)
    
    omega_m0=0.3
    
    dlabel= 'w(z) vz z'
    
    sp.var('z')
    
    def func(z):    
      H=((2/H0)*((b*(z+1)+c*(z+1)**0.5+2.0-a-b-c)*(1-0.5*a*(z+1)**(-0.5)) - ((z+1)-a*(z+1)**0.5-1.0+a)*(b+c*0.5*(z+1)**(-0.5)))/(b*(z+1)+c*(z+1)**0.5+2.0-a-b-c)**2)**(-1) 
      return ((2*(z+1)/3)*(sp.diff(sp.log(H)))-1)/(1-(H/H0)**2*omega_m0*(z+1)**3)
    
    wz = [func(z).evalf(subs = {z : y}) for y in x]
    
    plt.plot(x,wz)
    plt.xlabel('z')
    plt.ylabel('w(z)')
    plt.show()
    

    编辑:为了获得wz,下面的代码要快得多(参见Evaluate sympy expression from an array of values):

    from sympy.utilities.lambdify import lambdify
    func_np_ready = lambdify(z, func(z),'numpy') # returns a numpy-ready function
    wz = func_np_ready(x)
    

    【讨论】:

    • 没问题,你可以考虑接受我的回答;)
    【解决方案2】:

    您最好使用 sympy 标记您的问题 - 这可能是导致问题的其中一个函数的行为,其他人可能知道所有相关信息。

    将那些非常长的公式分成多行(至少在调试时)以帮助您跟踪错误可能是个好主意。也放一些印刷品等。

    我知道这不是您想要实现的,但如果我删除 sympy(我没有安装它!)并调整它绘制的数组长度而不会出错:

        ...
        H=((2/H0)*((b*(z+1)+c*(z+1)**0.5+2.0-a-b-c)*(1-0.5*a*(z+1)**(-0.5)) - ((z+1)-a*(z+1)**0.5-1.0+a)*(b+c*0.5*(z+1)**(-0.5)))/(b*(z+1)+c*(z+1)**0.5+2.0-a-b-c)**2)**(-1) 
        return ((2*(z[:-1]+1)/3)*(np.diff(np.log(H)))-1)/(1-(H[:-1]/H0)**2*omega_m0*(z[:-1]+1)**3)
    
    wz=func(z)
    
    plt.plot(z[:-1],wz)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      • 1970-01-01
      • 2020-04-26
      • 1970-01-01
      • 2019-07-10
      • 1970-01-01
      相关资源
      最近更新 更多