You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为iohub事件与眼动追踪数据表添加自定义试次识别列?

给iohub事件和眼动追踪数据表添加自定义试次识别列

嘿,这个问题我当初第一次搭iohub+PsychoPy的眼动实验时也纠结过!完全可以给iohub的事件记录和眼动数据表加上自定义的试次标识(比如你说的刺激图片名称),下面给你两种实用的方法:

方法1:用iohub内置变量自动附加标识

iohub本身支持给当前实验上下文设置自定义变量,这些变量会自动绑定到后续所有的眼动事件和数据记录中,不用事后手动匹配,非常省心。

具体步骤很简单:在每个试次开始前,调用iohub.setVariable()方法传入你的自定义标识就行。示例代码如下:

# 先初始化iohub和眼动追踪设备
from psychopy.iohub import launchHubServer
from psychopy import visual, core

iohub = launchHubServer()
eyetracker = iohub.devices.eyetracker
win = visual.Window(size=(1920,1080))

# 假设你有一个试次列表,每个试次包含刺激图片名称
trial_list = [{'stimulus': 'cat.jpg'}, {'stimulus': 'dog.jpg'}, {'stimulus': 'bird.jpg'}]

# 开启眼动记录
eyetracker.startRecording()

for trial in trial_list:
    # 获取当前试次的刺激图片名称
    current_stim = trial['stimulus']
    
    # 设置iohub自定义变量,这个变量会自动添加到所有后续眼动数据里
    iohub.setVariable('trial_stim_name', current_stim)
    
    # 呈现你的刺激
    stim_img = visual.ImageStim(win, image=current_stim)
    stim_img.draw()
    win.flip()
    
    # 等待试次时长
    core.wait(2.0)
    
    # 可选:清除变量,不过下一个试次的setVariable会自动覆盖它
    # iohub.clearVariable('trial_stim_name')

# 停止记录并关闭iohub
eyetracker.stopRecording()
iohub.quit()
win.close()

当你导出iohub的眼动数据(比如CSV或EDF格式)时,就能看到新增的trial_stim_name列,每个行的对应值就是你设置的刺激图片名称,完美对应到每个试次的眼动数据。

方法2:手动记录试次时间范围,事后关联标识

如果需要更灵活的控制(比如试次内有多个子阶段需要区分),可以手动记录每个试次的时间范围,之后把试次标识和iohub的时间戳数据做匹配。

示例代码如下:

from psychopy.iohub import launchHubServer
from psychopy import visual, core
import pandas as pd

iohub = launchHubServer()
eyetracker = iohub.devices.eyetracker
win = visual.Window(size=(1920,1080))

trial_list = [{'stimulus': 'cat.jpg'}, {'stimulus': 'dog.jpg'}, {'stimulus': 'bird.jpg'}]
eyetracker.startRecording()

# 用来存储试次时间和标识的列表
trial_info = []

for trial in trial_list:
    current_stim = trial['stimulus']
    # 用iohub的时间戳(和眼动数据的时间戳一致)记录试次开始时间
    trial_start = iohub.getTime()
    
    # 呈现刺激
    stim_img = visual.ImageStim(win, image=current_stim)
    stim_img.draw()
    win.flip()
    
    core.wait(2.0)
    
    # 记录试次结束时间
    trial_end = iohub.getTime()
    # 保存试次信息
    trial_info.append({
        'stim_name': current_stim,
        'start_time': trial_start,
        'end_time': trial_end
    })

eyetracker.stopRecording()
iohub.quit()
win.close()

# 事后关联数据:读取iohub导出的眼动CSV,匹配试次标识
eye_data = pd.read_csv('iohub_eye_recording.csv')
trial_df = pd.DataFrame(trial_info)

# 给每一行眼动数据匹配对应的刺激名称
eye_data['trial_stim_name'] = eye_data['time'].apply(
    lambda timestamp: trial_df[
        (trial_df['start_time'] <= timestamp) & (timestamp <= trial_df['end_time'])
    ]['stim_name'].values[0]
)

# 保存关联好的数据
eye_data.to_csv('eye_data_with_stim_labels.csv', index=False)

两种方法各有优势:第一种适合大多数常规实验,不用额外处理数据;第二种适合复杂实验设计,能实现更精细的标识匹配。

内容的提问来源于stack exchange,提问作者Krzysztof Krejtz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:05:01