python中不同长度点的平均多个向量
我有一个不同试验的轨迹列表,它们本身就是一个点列表python中不同长度点的平均多个向量,python,interpolation,Python,Interpolation,我有一个不同试验的轨迹列表,它们本身就是一个点列表 trajectories = [[(x,y),(x,y), ...], [(x,y), ...], ...] 分数因试验而异 最终目标是绘制整个试验的平均轨迹+/-SEM(平均标准误差) 据我所知,我应该得到最长的轨迹,对于剩余的每个轨迹,将“分辨率”添加到其他向量上,使它们具有相同的长度,因此类似于这样: #find the maximum length max_len = len(trajectories[0]) longest = []
trajectories = [[(x,y),(x,y), ...], [(x,y), ...], ...]
分数因试验而异
最终目标是绘制整个试验的平均轨迹+/-SEM(平均标准误差)
据我所知,我应该得到最长的轨迹,对于剩余的每个轨迹,将“分辨率”添加到其他向量上,使它们具有相同的长度,因此类似于这样:
#find the maximum length
max_len = len(trajectories[0])
longest = []
for t in trajectories:
if len(t) > max_len:
max_len = len(t)
longest = t
# now transform the other vectors I assume using the longest vector or the length of this vector
newTrajectories = []
for i,t in enumerate(trajectories):
newTrajectories[i] = resample(t, longest or max_len, or something similar!!)
有没有一个函数给出了一个lenx的元组(x,y)向量和另一个leny的元组向量,其中x>y将点(x,y)添加到y向量的正确位置,比如使用上一个和下一个点的平均值或中值
编辑:
我能想到的最简单的例子是使用2个轨迹向量:
vec_one = [(2,4),(3,5),(1,6)]
vec_two = [(2,4), (1,6)]
它们都从x=2,y=4开始,以x=1,y=6结束
然而,vec_one更长(需要更多时间)。
我认为,为了能够在整个轨迹上求平均值,vec_2需要更长,因此我需要以某种方式推断缺失的x,y位置的值
我一直在研究scypi.interpolate模块的splprep、splrep和splev,但恐怕我还不太了解它们
Edit2:实际上,我试图从(x,y)时间序列中提取时间。因此,问题变成了在哪里引入新值,以及根据哪些标准我选择了一个“站点”来插入值,我推断值的方式现在似乎不那么重要了…不幸的是,没有人愿意接受,我觉得这是一个可行的解决方案 我不得不改变数据的格式来解决这个问题。 因此,与其有一个(x,y)点数可变的试验列表: [(x,y),(x,y),…],[(x,y),(…),…] 我现在有3个numpy.array: sx=数组([23,34,42,…,56,56,63]) sy=数组([78,94,20,…,44,38,34]) st=数组([1,1,1,…,293,293,293]) 所有向量的长度与它们基本上是表的一部分相同,其中sx是包含所有x位置的列,sy是所有y位置,st是试验编号(或x和y位置的列表ID)st基本上是一组重复的数字[1,1,1,1,1,2,2,2,3,3,3,3,…] (实际上,我使用HDF5/pytables来存储数据,它是从包含跟踪数据的表中直接读取的) 此解决方案使用interp1d
from scipy.interpolate import interp1d
当然还有努比
import numpy as np
我承认这是一个黑客破解的解决方案,速度不是很快,但它确实有效:)另一方面,重新阅读我自己的问题让我觉得它并没有很清楚地阐述我的问题。。。对不起。不管怎样,这就是解决办法
下面的func接收我上面描述的3个VEC,trialList,它是要折叠的试验列表,kind,它是您想要折叠的类型,现在可以是平均值或中间值。它将返回折叠轨迹,即trialList平均值或中间值的x和y位置
def collapseTrajectories(sx, sy, st, trialList, kind='median'):
# find the longest trial to use as template
l = 0
tr = []
for t in trialList:
if len(st[st==t]) > l:
l = len(st[st==t])
tr = t
# Make all vectors the same length by interpolating the values
xnew = np.linspace(0, 640, l)
ynew = np.linspace(0, 480, l)
sx_new = []
sy_new = []
for t in trialList:
if len(st[st==t]) > 3:
X = sx[st==t]
Y = sy[st==t]
x = np.linspace(0,640, len(X))
y = np.linspace(0,480,len(Y))
fx = interp1d(x, X, kind='cubic')
fy = interp1d(y, Y, kind='cubic')
sx_new.append(fx(xnew))
sy_new.append(fy(ynew))
# Collapse using the appropriate kind
if kind == 'median':
out_x = np.median(sx_new, axis=0)
out_y = np.median(sy_new, axis=0)
elif kind=='mean':
out_x = np.mean(sx_new, axis=0)
out_y = np.mean(sy_new, axis=0)
return out_x, out_y
你所说的“试验平均轨迹”是什么意思。你是说“平均轨迹+/-总和”吗??如果你需要平均轨迹,你所说的+/-是什么意思?对不起,SEM=平均值的标准误差:)那么轨迹坐标呢。。x,y坐标是整数值吗?对于一个给定的轨迹,你有没有每个xX和y的轨迹坐标是浮动的,它们是我在640x480,30fps视频中跟踪的像素分布的重心。我不明白你所说的“x的轨迹坐标”是什么意思。基本上,我假设你需要在计算机扫描电镜前找到平均轨迹。这是否正确?要找到平均轨迹,你需要平均每个x值的y坐标。x的范围应该是[0,max_range].为了能找到y在每个x上的平均值,你需要所有x的轨迹坐标小于这个范围。我希望这能让我更清楚。让我知道我的理解是否正确。将其扩展到三维插值的方法是什么?也就是说,我有(x,y,z)需要插值?