将numpy数组根据其内容拆分成相似的数组

4
我有一个二维numpy数组,表示一条曲线的坐标(x,y),我想将该曲线分成相同长度的部分,并获取分割点的坐标。

最简单的例子是由两个点定义的直线,例如[[0,0],[1,1]],如果我想将其分成段,则结果将为[0.5,0.5],对于段,则结果将为[[0.33,0.33],[0.67,0.67]],等等。

当数据较为复杂时,如何在大型数组中进行操作呢?我尝试按照其长度来分割数组,但结果不理想。
2个回答

2

如果我理解正确,您想要的是一种简单的插值。为此,您可以使用 scipy.interpolatehttp://docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html):

from scipy.interpolate import interp1d
f = interp1d(x, y) ## for linear interpolation
f2 = interp1d(x, y, kind='cubic') ## for cubic interpolation
xnew = np.linspace(x.min(), x.max(), num=41, endpoint=False)
ynew = f(xnew) ## or f2(xnew) for cubic interpolation

您可以创建一个函数,该函数返回拆分点的坐标,给定xy和所需点数:
def split_curve(x, y, npts):
    from scipy.interpolate import interp1d
    f = interp1d(x, y)
    xnew = np.linspace(x.min(), x.max(), num=npts, endpoint=False)
    ynew = f(xnew)
    return zip(xnew[1:], ynew[1:])

例如,
split_curve(np.array([0, 1]), np.array([0, 1]), 2) ## returns [(0.5, 0.5)]
split_curve(np.array([0, 1]), np.array([0, 1]), 3) ## [(0.33333333333333331, 0.33333333333333331), (0.66666666666666663, 0.66666666666666663)]

请注意,x和y是numpy数组而不是列表。

好的,回顾一下,我认为我误读了问题,因为我下面发布的代码将曲线的每个部分拆分而不是整个曲线...失败了。 - ebarr

1

获取每个坐标轴上的线段长度,根据需要进行分割。

例如: 点1:[0,0] 点2:[1,1]

那么: X轴上的线段长度为:1-0 = 1 Y轴也是如此。

现在,如果您想将其分成两部分,只需将这些长度除以二,并创建一个新数组即可。

[0,0],[.5,.5],[1,1]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接