2012-04-16 3 views
3

Используя некоторые экспериментальные данные, я не могу на всю жизнь разобраться, как использовать splrep для создания B-сплайна. Данные здесь: http://ubuntuone.com/4ZFyFCEgyGsAjWNkxMBKWDКак использовать scipy.interpolate.splrep для интерполяции кривой?

Вот отрывок:

#Depth Temperature 
1 14.7036 
-0.02 14.6842 
-1.01 14.7317 
-2.01 14.3844 
-3 14.847 
-4.05 14.9585 
-5.03 15.9707 
-5.99 16.0166 
-7.05 16.0147 

и вот сюжет его с глубиной от у и температуры на х: enter image description here

Вот мой код:

import numpy as np 
from scipy.interpolate import splrep, splev 

tdata = np.genfromtxt('t-data.txt', 
         skip_header=1, delimiter='\t') 
depth = tdata[:, 0] 
temp = tdata[:, 1] 

# Find the B-spline representation of 1-D curve: 
tck = splrep(depth, temp) 
### fails here with "Error on input data" returned. ### 

Я знаю, что делаю что-то кровоточащее глупо, но я просто не вижу его.

ответ

6

Вам просто нужно иметь свои значения от самых маленьких до самых больших :). Это не должно быть проблемой для вас @a другого ben, но будьте осторожны с читателями в будущем, depth[indices] будет бросать TypeError, если глубина - это список вместо массива numpy!

>>> indices = np.argsort(depth) 
>>> depth = depth[indices] 
>>> temp = temp[indices] 
>>> splrep(depth, temp) 
(array([-7.05, -7.05, -7.05, -7.05, -5.03, -4.05, -3. , -2.01, -1.01, 
     1. , 1. , 1. , 1. ]), array([ 16.0147 , 15.54473241, 16.90606794, 14.55343229, 
     15.12525673, 14.0717599 , 15.19657895, 14.40437622, 
     14.7036 , 0.  , 0.  , 0.  , 0.  ]), 3) 

Hat наконечник к @FerdinandBeyer для предложению argsort вместо моего некрасиво «застежка-молния, своего рода почтовый, повторно присвоить значения значения» метод.

+2

Для сортировки данных вы, вероятно, должны использовать функцию 'np.argsort()': indexs = np.argsort (depth); depth = глубина [индексы]; temp = temp [индексы] '. Это избавит вас от переполнения списка кортежей. –

+0

@FerdinandBeyer Это гораздо лучшее решение, чем мое! Теперь редактируем его. –

+0

У меня возникла ошибка, когда я пытался сделать 'depth [индексы]', но, пожалуйста, дайте мне знать, если есть более хороший способ, чем '[depth [i] для i в индексе]'. В любом случае это гораздо более чистое решение, спасибо. –

Смежные вопросы