Сплайновая интерполяция Scipy: перед фактическим вычислением определить длину массива вектора узлов / B-сплайновых коэффициентов в tck - PullRequest
0 голосов
/ 06 июня 2019

Возможно ли как-то определить длину массива массивов в кортеже tck, возвращаемом scipy.interpolate.splprep, перед вычислением значений?

Я должен приспособить сплайн-интерполяцию к шумным данным с 5 миллионами точек данных (или меньше, может варьироваться). Мое наблюдение состоит в том, что интерполяция при длине массива ~ 90 довольно хороша, в то время как вычисление интерполяции для более длинных массивов занимает много времени (иногда она также напрямую переходит с ~ 90 на ~ 1000, делая с на один шаг меньше, и интерполяция также становится шумной), и этого недостаточно, если длина массива намного меньше (<50) ... </p>

На самом деле, эта длина массива зависит от коэффициента сглаживания с , предоставленного функции splprep, но для разных данных измерений с сильно варьируется для получения согласованной длины массива около 90. Например, для data1 s имеет значение около 1000, чтобы получить len(cfk[0]) равно 90, для data2 s имеет значение около 100, чтобы получить len(cfk[0]) равно 90 при одинаковой длине data1 и data2. Это может зависеть от шума данных ...

Я думал о цикле, где s начинается в некоторой точке и уменьшается через цикл, в то время как len(cfk[0]) постоянно проверяется - но это занимает много времени, особенно если len(cfk[0]) приближается к 90.

Поэтому было бы полезно как-то узнать коэффициент сглаживания, чтобы получить желаемую длину массива, прежде чем вычислять кортеж cfk.

1 Ответ

0 голосов
/ 06 июня 2019

Краткий ответ: нет, не легко. В библиотеке Dierckx Fortran, которая выполняет расщепление, используется некоторая довольно нетривиальная логика для определения вектора узла, и все это встроено в код Fortran. Таким образом, единственный способ - внимательно проследить за последним. Это доступно из netlib, также scipy / interpolate / fitpack

...