使用scipy.splprep时如何指定结点数
How to specify the number of knot points when using scipy.splprep
我有以下一段代码。它生成以参数形式给出的给定 3-D 函数的 3-D 三次样条。我使用 splprep and splev.
的在线文档对我的情况进行了很大程度的调整
但是我有些事情我不明白。这是代码:
%matplotlib inline
from numpy import arange, cos, linspace, pi, sin, random
from scipy.interpolate import splprep, splev
import matplotlib.pyplot as plt
# make ascending spiral in 3-space
t=linspace(0,1.75*2*pi,100)
x = sin(t)
y = cos(t)
z = t
# spline parameters
s=3.0 # smoothness parameter
k=3 # spline order
nest=-1 # estimate of number of knots needed (-1 = maximal)
# find the knot points
tck,u = splprep([x,y,z],s=s,k=k,nest=-1)
# evaluate spline, including interpolated points
xnew,ynew,znew = splev(linspace(0,1,400),tck)
关于这个实现我有几个问题。
在这种情况下 (t,c,k)
元组 return 究竟是什么?我阅读了文档,它说 return 是结点、系数和样条的阶数。结点不是必须是 (x, y, z) 形式的坐标吗?所以我们得有"number of knots"
个这样的坐标点。但这不是 returned 的内容。我们只是得到 returned 一个 length 11
的数组。
u
return是什么意思? (文档说它 returns 参数的值。这是什么意思?参数的值 t
?
当我使用 nest = -1(这是默认值)时,它使用所需的最大结点数(在这种情况下,它们使用 11
结点)。但是我如何指定我自己的结点数,比如 50 或 80 等?
我完全误解了这里的文档。有人可以启发我可能正在使用示例吗?
参数u的值
想法是您的点 [x,y,z] 是某些 参数化曲线 的值,原始参数在您的示例中为 t。了解参数 t 的值有助于确定如何在这些点之间进行插值。因此,您可以选择将参数值作为可选参数 u
传递(在此示例中为 u=t
)。但如果您选择不这样做,该方法将根据给定点之间的距离(参数间隔将从 0 到 1)猜测参数值。这个猜测然后作为变量 u
返回给你,所以你知道数据是如何解释的。如果你确实传递了 u=t 作为参数,你得到的 u
是完全一样的。
您并不真的需要这个 u
来使用样条曲线。但是,如果希望将原始 [x,y,z] 点的位置与样条的值进行比较,那么您可能希望将 u
作为参数传递给 splev
。解释 u
含义的一种更简短的方法是:splev
需要重现您开始使用的 [x,y,z]
坐标,由于平滑会出现一些偏差。
检查值
样条的节点 t
是 参数区间 中的点,而不是 3D space 中的点。由于在您的示例中参数间隔为 [0,1],默认情况下选择,因此 t 的值在此范围内。 knot 是样条的某些系数发生变化的参数区间上的一个地方。端点 0 和 1 在技术上是多个结,因此它们被多次列出。
曲线的 3D 特性由系数 c
表示。您可能会注意到它是一个包含三个数组的列表,每个坐标一个。
节点数
有了这个插值例程,你有两个选择:
- 准确地告诉它结点是什么(通过给定
task=-1
并提供 t
结点参数)。为避免混淆:此 t
不一定是您从中获得点 [x,y,z] 的 t
。不一定希望每个样本点都是结点。
- 将结的确定留给常规,包括它们的数量。
然而,节点的数量取决于平滑度参数的值s
,因此它可以被间接影响。例如,对于您的数据,s=3 时有 11 节,s=1 时有 12 节,s=0.1 时有 14 节。
我有以下一段代码。它生成以参数形式给出的给定 3-D 函数的 3-D 三次样条。我使用 splprep and splev.
的在线文档对我的情况进行了很大程度的调整但是我有些事情我不明白。这是代码:
%matplotlib inline
from numpy import arange, cos, linspace, pi, sin, random
from scipy.interpolate import splprep, splev
import matplotlib.pyplot as plt
# make ascending spiral in 3-space
t=linspace(0,1.75*2*pi,100)
x = sin(t)
y = cos(t)
z = t
# spline parameters
s=3.0 # smoothness parameter
k=3 # spline order
nest=-1 # estimate of number of knots needed (-1 = maximal)
# find the knot points
tck,u = splprep([x,y,z],s=s,k=k,nest=-1)
# evaluate spline, including interpolated points
xnew,ynew,znew = splev(linspace(0,1,400),tck)
关于这个实现我有几个问题。
在这种情况下
(t,c,k)
元组 return 究竟是什么?我阅读了文档,它说 return 是结点、系数和样条的阶数。结点不是必须是 (x, y, z) 形式的坐标吗?所以我们得有"number of knots"
个这样的坐标点。但这不是 returned 的内容。我们只是得到 returned 一个length 11
的数组。u
return是什么意思? (文档说它 returns 参数的值。这是什么意思?参数的值t
?当我使用 nest = -1(这是默认值)时,它使用所需的最大结点数(在这种情况下,它们使用
11
结点)。但是我如何指定我自己的结点数,比如 50 或 80 等?
我完全误解了这里的文档。有人可以启发我可能正在使用示例吗?
参数u的值
想法是您的点 [x,y,z] 是某些 参数化曲线 的值,原始参数在您的示例中为 t。了解参数 t 的值有助于确定如何在这些点之间进行插值。因此,您可以选择将参数值作为可选参数 u
传递(在此示例中为 u=t
)。但如果您选择不这样做,该方法将根据给定点之间的距离(参数间隔将从 0 到 1)猜测参数值。这个猜测然后作为变量 u
返回给你,所以你知道数据是如何解释的。如果你确实传递了 u=t 作为参数,你得到的 u
是完全一样的。
您并不真的需要这个 u
来使用样条曲线。但是,如果希望将原始 [x,y,z] 点的位置与样条的值进行比较,那么您可能希望将 u
作为参数传递给 splev
。解释 u
含义的一种更简短的方法是:splev
需要重现您开始使用的 [x,y,z]
坐标,由于平滑会出现一些偏差。
检查值
样条的节点 t
是 参数区间 中的点,而不是 3D space 中的点。由于在您的示例中参数间隔为 [0,1],默认情况下选择,因此 t 的值在此范围内。 knot 是样条的某些系数发生变化的参数区间上的一个地方。端点 0 和 1 在技术上是多个结,因此它们被多次列出。
曲线的 3D 特性由系数 c
表示。您可能会注意到它是一个包含三个数组的列表,每个坐标一个。
节点数
有了这个插值例程,你有两个选择:
- 准确地告诉它结点是什么(通过给定
task=-1
并提供t
结点参数)。为避免混淆:此t
不一定是您从中获得点 [x,y,z] 的t
。不一定希望每个样本点都是结点。 - 将结的确定留给常规,包括它们的数量。
然而,节点的数量取决于平滑度参数的值s
,因此它可以被间接影响。例如,对于您的数据,s=3 时有 11 节,s=1 时有 12 节,s=0.1 时有 14 节。