基於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