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

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 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题