ShiC的自习室 2021-10-18 10:07 采纳率: 50%
浏览 123
已结题

python中多次调用同一个函数,不同形参,输出结果为什么没变化

这里我调用了两次bandpass函数,实现对原数据进行带通滤波,目的是得到从一个原数据data中得到三个不同频带的数据,但是结果出来却相同的并且是错的,而这三个各自单独调用一次(即注释掉另外两个bandpass的调用)的时候又都是对的,难道是python自动保存了什么数据没清空吗?还是什么原因,实在想不明白,请大家帮忙解答,万分感谢!

def bandpass(data, f1, f2, step, sfreq):
    wn1 = 2*f1/sfreq
    wn2 = 2*f2/sfreq
    redata = data
    #带通滤波
    for subject in redata:
        for session in redata[subject]:
            for channel in redata[subject][session]:
                for event in range(len(redata[subject][session][channel])):
                    #带通滤波
                    [b, a] = signal.butter(step, [wn1, wn2], 'bandpass')  #8
                    data_bandpass = signal.filtfilt(b, a, redata[subject][session][channel][event])
                    redata[subject][session][channel][event] = data_bandpass
    return redata

if __name__ == "__main__":
    data = np.load('data.npy', allow_pickle=True).item()
    sfreq = 250
    data_bandpass47 = bandpass(data=data, f1=4, f2=7, step=4, sfreq=sfreq)
    data_bandpass813 = bandpass(data=data, f1=8, f2=13, step=8, sfreq=sfreq)
    data_bandpass1332 = bandpass(data=data, f1=13, f2=32, step=12, sfreq=sfreq)
  • 写回答

1条回答 默认 最新

  • 於黾 2021-10-18 10:26
    关注

    你在函数里执行了
    redata = data
    然后又修改了redata
    redata[subject][session][channel][event] = data_bandpass
    那么其实你就修改了data,因为data是引用类型,不是值
    如果你不想修改原数组,你需要redata = data.clone()

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月26日
  • 已采纳回答 10月18日
  • 创建了问题 10月18日

悬赏问题

  • ¥15 关于 S7-PLCSIM Advanced 5.0本地TCP连接无法读写数据
  • ¥15 关于温度改变石墨烯介电性能(关键词-介电常数)
  • ¥150 HDMI分路器LT86102 的输出在890MHz频点处EMC超标8DB
  • ¥15 druid(相关搜索:数据库|防火墙)
  • ¥15 大一python作业
  • ¥15 preLaunchTask"C/C++: aarch64- apple-darwin22-g++-14 生成活动 文件”已终止,退出代码为-1。
  • ¥60 如何鉴定微信小程序数据被篡改过
  • ¥18 关于#贝叶斯概率#的问题:这篇文章中利用em算法求出了对数似然值作为概率表参数,然后进行概率表计算,这个概率表是怎样计算的呀
  • ¥20 C#上传XML格式数据
  • ¥15 elementui上传结合oss接口断点续传,现在只差停止上传和继续上传,各大精英看下