我正在研究一种用于视觉固定数据的引导程序,并且在我遇到的这个问题上,其他人的见解可以帮助我。我怀疑要么我遗漏了与随机数生成器(random.randrange)功能相关的东西,要么它显示了我目前新手对numpy数组迭代和切片的理解。作为一名只有业余爱好程度的编程经验的心理学家,如果事实证明我是以一种非常倒退的方式做到这一点,我不会感到惊讶。
当你想对视觉注视数据进行统计分析时,你经常需要考虑中心偏差,这是观察者倾向于首先更多地固定在图像中心并且在图像中更随机地固定的偏差后来。这种偏差导致固定之间的时间相关性,并且对此类数据执行的ROC分析(接收器操作员特性)需要基于特定类型的 bootstrap 方法的基线。
在这种情况下,数据位于名为原始的numpy数组中。此数组的形状为(22,800,15,2),其中尺寸表示[观察者,图像,固定< / strong>( x , y )]。因此,每个图像每个观察者有15个注视。
在引导程序中,我们通常希望用在所有其他图像和所有观察者的集合中的某个地方发生的另一个固定来替换每个固定,但同时(在这种情况下:相同的固定索引,指数2 原始)。
我认为这意味着我们必须做以下事情:
我有一个函数,它采用数组原始并执行上面所描述的内容,稍作修改,当只有一个原始x,y对是NaN时,它只设置x或y随机固定到np.nan。当我遍历循环时,我看到了很好的结果。在迭代了+ - 10个循环后,我很满意,因为所有数据看起来都很完美,之后我继续删除我设置的raw_input()断点,让函数处理所有数据而不会中断。当我这样做时,我注意到函数减慢每个循环并在到达observer = 0 image = 48时停止。
我的代码如下:
for obs_index, obs in enumerate(original):
for img_index, img in enumerate(obs):
print obs_index, img_index
for fix_index, fix in enumerate(img):
# do the following because sometimes only x or y in the original is NaN
rand_fix = (np.nan, np.nan)
while np.isnan(rand_fix[0]) or np.isnan(rand_fix[1]):
rand_obs = randrange(observers)
rand_img = img_index
while rand_img == img_index:
rand_img = randrange(images)
rand_fix = original[rand_obs, rand_img, fix_index]
# do the following because sometimes only x or y in the original is NaN
if np.isnan(fix[0]):
rand_fix[0] = np.nan
if np.isnan(fix[1]):
rand_fix[1] = np.nan
shuffled[obs_index, img_index, fix_index] = rand_fix
当此功能完成时,改组应包含正确改组的固定数据,以便在ROC分析中使用。
答案 0 :(得分:0)
<强>解决强>
我提出了以下代码,不再放慢速度:
for obs_index, obs in enumerate(original):
for img_index, img in enumerate(obs):
for fix_index, fix in enumerate(img):
x = fix[0]
y = fix[1]
rand_x = np.nan
rand_y = np.nan
if not(np.isnan(x) or np.isnan(y)):
while np.isnan(rand_x) or np.isnan(rand_y):
rand_obs = randrange(observers)
rand_img = img_index
while rand_img == img_index:
rand_img = randrange(images)
rand_x = original[rand_obs, rand_img, fix_index, 0]
rand_y = original[rand_obs, rand_img, fix_index, 1]
shuffled[obs_index, img_index, fix_index, 0] = rand_x
shuffled[obs_index, img_index, fix_index, 1] = rand_y
我还修复了将新固定分配到改组中的位置的方式,以便正确地遵循numpy索引。