解决scipy.signal.welch处理后matplotlib绘图x/y维度不匹配报错
报错解决方案
ValueError: x and y must have same first dimension报错的核心原因是你对f和Welch两个数组单独做阈值过滤,两者的过滤逻辑没有对齐,导致最终传入plt.plot的两个数组长度不一致。
以下是两种可行的修复方案:
方案1:使用统一布尔掩码对齐过滤(推荐)
仅保留两个数组对应位置都满足阈值要求的元素,完全保证长度匹配,修改代码如下:
f, Welch = signal.welch(Txt, fs=1.0, window="hann", nperseg=None, noverlap=None, nfft=3062, detrend="constant", return_onesided=True, scaling="density", axis=-1, average="mean") # 生成统一掩码:对应位置的f和Welch都大于1e-14才保留 valid_mask = (f > 1e-14) & (Welch > 1e-14) BypassZero1 = f[valid_mask] BypassZero2 = Welch[valid_mask] Log_f = np.log(BypassZero1) Log_Welch = np.log(BypassZero2) plt.plot(Log_f, Log_Welch)
这种方式既彻底避免了log计算零值的警告,也不会出现维度不匹配问题。
方案2:无需提前过滤,直接屏蔽警告
如果不想丢失任何数据点,可以利用np.log内置参数或者临时警告屏蔽机制,不修改原始数组长度(signal.welch输出的f和Welch本身长度是对齐的):
import warnings f, Welch = signal.welch(Txt, fs=1.0, window="hann", nperseg=None, noverlap=None, nfft=3062, detrend="constant", return_onesided=True, scaling="density", axis=-1, average="mean") # 临时屏蔽log除零警告 with warnings.catch_warnings(): warnings.filterwarnings("ignore", category=RuntimeWarning, message="divide by zero encountered in log") Log_f = np.log(f) Log_Welch = np.log(Welch) plt.plot(Log_f, Log_Welch)
另外你代码里还有一个小bug:Subjects = ["Subject1" "Subject2"]两个字符串之间缺少逗号,Python会自动把两个字符串拼接成Subject1Subject2,需要改成Subjects = ["Subject1", "Subject2"]。
内容的提问来源于stack exchange,提问作者Philipp
相关产品推荐
相关产品推荐

