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)需要插值?