基于Python编写的互相关函数


import pandas as pd
import  numpy as np
from matplotlib import pyplot as plt
import os
import math
sticsvPath=r'E:\数据文件\3-23DataComplete\CIRCLE\STIM01trian'
path2=r'E:\\数据文件\\3-23DataComplete\\CIRCLE\\STIMCrossMartix'
#遍历该文件夹下所有.csv文件

def get_file(path):  # 创建一个空列表
    files = os.listdir(path)
    list = []
    for file in files:
        if not os.path.isdir(path + file):  # 判断该文件是否是一个文件夹
            f_name = str(file)
            #             print(f_name)
            tr = '\\'  # 多增加一个斜杠
            filename = path + tr + f_name
            #filename =  f_name
            list.append(filename)#得到所有
    return list
etm=np.zeros(4096)#第一个电极行为0
td=np.zeros(4096)
stiName=get_file(sticsvPath)#得到每个存放总csv数据的文件
for sn in stiName:#循环读取每个stim
    filename = os.path.basename(sn)  # 截取文件名
    s = filename.split('\\')[-1]  # 不带后缀的文件名(截取)
    newpath = path2 + '\\' + s  # .csv文件的路径+名字
    #os.makedirs(newpath)
    scsv=get_file(sn)#获得该stim下所有.csv文件的名
    for cFile in scsv:#一个.csv的文件,一个刺激时间点下的4096个电极的0-1序列
        k = 0
        data = pd.read_csv(cFile, header=None)
        data = np.array(data)
        data = np.transpose(data)
        csvname = os.path.basename(cFile)  # 截取文件名
        csv = csvname.split('.')[0]  # 不带后缀的文件名(截取)
        savePath=newpath +'\\'+csv
        for i in data:
            ref=i#参考电极
            ind1 = [d for d, x in enumerate(ref) if x == 1]  # 找到电极的位置
            maxvalueTrain=[]
            timeDelayTrain=[]
            if len(ind1) == 0:  # 如果电极没有spike,则为0
                maxvalueTrain = np.zeros(4096)#互相关系数矩阵
                timeDelayTrain = np.zeros(4096)#延迟时间矩阵
            else:
                for j in data:#目标电极
                   target=j
                   ind2 = [d for d, x in enumerate(target) if x == 1]  # 找到电极的位置
                   spikebin = np.array(range(100))
                   for s1 in ind1:#循环参考电极中1的位置
                        
                        if s1-50<0:#参考电极的位置<50
                            cha = abs(s1 - 50)#补充50-s1长度的0
                            cha1 = np.zeros(cha)
                            cha1 = np.r_[cha1, target[:s1 + 50]]#填充0与0-目标位置+50
                        else:
                            if s1 + 50 > 200:
                                cha1 = np.zeros(s1 - 150)#右边补充0的长度
                                cha1 = np.r_[target[s1 - 50:], cha1]
                            else:
                                cha1 = target[s1 - 50:s1 + 50]
                        spikebin=np.row_stack((spikebin,cha1))#将每次spike得到的序列添加到下一行
                   spikebin = np.delete(spikebin, 0, axis=0)#得到该参考电极的每个spike100长度的序列
                   a = []
                   for b in range(100):
                        p = spikebin[:, b]  # 取出每一列进行相加
                        a.append(sum(p))
                   a = np.array(a)
                   if len(ind2) == 0:#如果目标电极没有spike,则不需要归一化
                       a = a
                   else:
                       c = math.sqrt(len(ind1) * len(ind2))
                       a = a / c
                   maxvalue=max(a)
                   maxvalueTrain.append(maxvalue)  # 找到参考电极与目标电极归一化后最大的数值
                   maxind= [d for d, x in enumerate(a) if x == maxvalue]  # 找到归一化后最大值的位置
                   timeDelay=maxind[0]-50#计算最大值与中间位置之间的差值为延迟时间
                   timeDelayTrain.append(timeDelay)
                timeDelayTrain = np.array(timeDelayTrain)
                maxvalueTrain=np.array(maxvalueTrain)#所有目标电极的最大值
            etm = np.row_stack((etm, maxvalueTrain))#将每个电极的最大值添加一行
            td=np.row_stack((td,timeDelayTrain))#将每个延迟时间添加一行
            #print(i)
            k=k+1
            print(k)
        spiketrainAll1 = pd.DataFrame(data=etm[1:])
        spiketrainAll1.to_csv(savePath+'maxMatrix.csv', index=False, header=None)  # 进行数据的保存
        spiketrainAll2 = pd.DataFrame(data=td[1:])
        spiketrainAll2.to_csv(savePath+'TDMatrix.csv', index=False, header=None)

  


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM