MSEn函数调用触发NameError:Mobj未定义问题求助
问题排查与解决
错误核心原因
- 变量作用域错误:
Mobj是在MSEn函数内部定义的局部变量,函数外部无法访问。调用MSEn(dataset_mus,Mobj.x)时,全局作用域找不到Mobj,直接触发NameError。 - 类定义不规范:
MSobject类没有定义__init__构造方法,直接用MSobject(x)实例化会报错(默认构造函数不接受参数)。 - 附带问题:代码中还存在
Sig、Temp2未定义,Func2调用的coarse函数未实现等问题,这些也需要同步修复才能让代码正常运行。
修复方案
1. 修正类定义,添加构造方法
给MSobject类添加__init__方法,正确初始化实例属性:
class MSobject: def __init__(self, x): self.x = x # 根据函数中Mobj.Func.__name__的调用,补充Func属性(替换为实际熵计算函数) def dummy_entropy(data): return np.mean(data) self.Func = dummy_entropy
2. 调整变量作用域,在函数外创建实例
将Mobj的实例化逻辑移到MSEn函数外部,确保调用时变量处于全局作用域:
import numpy as np from matplotlib import pyplot as plt # 先定义MSobject类 class MSobject: def __init__(self, x): self.x = x def dummy_entropy(data): return np.mean(data) self.Func = dummy_entropy # 实现Func2对应的粗粒化函数(示例) def coarse(sig, scale): # 替换为实际粗粒化逻辑 return np.mean(sig.reshape(-1, scale), axis=1).mean() def MSEn(dataset_mus, Mobj, Scales=3, Methodx='coarse', RadNew=0, Plotx=False): dataset_mus = np.squeeze(dataset_mus) Func2 = globals()[Methodx.lower()] MSx = np.zeros(Scales) for T in range(1, Scales+1): print(' .', end='') Temp = Func2(dataset_mus, T) # 替换未定义的Sig为dataset_mus MSx[T-1] = Temp # 替换未定义的Temp2为Temp CI = sum(MSx) if np.any(np.isnan(MSx)): print('Some entropy values may be undefined.') if Plotx: plt.figure() ax1 = plt.axes() ax1.plot(np.arange(1, Scales+1), MSx, color=(8/255, 63/255, 77/255), linewidth=3) ax1.scatter(np.arange(1, Scales+1), MSx, 60, color=(1,0,1)) ax1.set_xlabel('Scale Factor',fontsize=12,fontweight='bold',color=(7/255, 54/255, 66/255)) ax1.set_ylabel('Entropy Value',fontsize=12,fontweight='bold',color=(7/255, 54/255, 66/255)) ax1.set_title('Multiscale %s (%s-graining method)'%(Mobj.Func.__name__,Methodx), fontsize=16,fontweight='bold',color=(7/255, 54/255, 66/255)) plt.show() return MSx, CI # 在全局作用域创建Mobj实例 x = (5,2,[3.2]) Mobj = MSobject(x) # 构造测试用的dataset_mus dataset_mus = np.random.rand(100) # 正常调用函数 MSx, CI = MSEn(dataset_mus, Mobj)
关键修复点总结
- 将
MSobject类定义和Mobj实例化移到MSEn函数外部,确保调用时变量可访问。 - 补全
MSobject的构造方法,正确初始化实例属性。 - 修复未定义的变量(
Sig、Temp2),实现coarse等辅助函数。 - 补充
matplotlib库的导入,修正绘图函数的调用方式。
内容的提问来源于stack exchange,提问作者Mhadm014
相关产品推荐
相关产品推荐

