2013-05-24 3 views
6

У меня есть два массива 1D, один для измеренных данных, а другой для местоположения. Например, измеренные данные могут быть температура и другой массив высоты измерения:Интервальное среднее данных 1D

temp = np.asarray([10, 9.6, 9.3, ..., -20.3, -21.0]) # Temperature in celsius 
height = np.asarray([129, 145, 167, ..., 5043, 5112]) # Height in meters 

Как видно, высота измерений не равномерно распределены.

Я хочу вычислить среднюю температуру на регулярных расстояниях. Это некоторая скользящая средняя, ​​но размер окна является переменным, потому что точки данных внутри интересующего интервала не всегда одинаковы.

Это может быть сделано с для цикла следующим образом:

regular_heights = np.arange(0, 6000, 100) # Regular heights every 100m 
regular_temps = [] 

for i in range(len(regular_heights)-1): 
    mask = np.logical_and(height > regular_heights[i], height < regular_heights[i+1]) 
    mean = np.mean(temp[mask]) 
    regular_temps.append(mean) 

regular_temps = np.hstack((regular_temps)) 

мне не нравится этот подход, который много и мне было интересно, если бы более «NumPy стиле» решение.

+0

Вы хотите «скользящей средней» или «среднюю температуру в равномерно расположенных интервалах»? То есть, если у вас есть N интервалов, вам нужны N средних значений или вы хотите непрерывное среднее значение с помощью движущегося окна (которое охватывает диапазон высот в каждом месте)? – tom10

+0

Как я уже сказал в своем commnet для ответа @elyase, мне, вероятно, нужно сначала определить среднее значение в регулярных интервалах, а затем сгладить его сплайном. Однако скользящее среднее также может быть хорошим в сочетании с сплайном. –

ответ

3

Возможно, вы ищете UnivariateSpline. Например:

from scipy.interpolate import UnivariateSpline 

temp = np.asarray([10, 9.6, 9.3, 9.0, 8.7]) # Temperature in celsius 
height = np.asarray([129, 145, 167, 190, 213]) # Height in meters 
f = UnivariateSpline(height, temp) 

Теперь вы можете оценить f где вы хотите:

regular_heights = np.arange(120, 213, 5)  # Regular heights every 5m 
plot(height, temp, 'o', regular_heights, f(regular_heights), 'x') 

enter image description here

+1

'f (regular_heights)' дает интерполированное значение в этих точках. Не то, что запросили ОП - среднее значение значений в пределах интервалов высоты. – mg007

+0

Я знаю, что он упомянул «среднее», но довольно расплывчато (что?). Похоже, это то, чего он на самом деле хочет, вот почему я сказал «вероятно, ищу ...». Если вы хотите, вы можете опубликовать ответ со средним значением, я думаю, мы узнаем, в конце концов, что он ждет. – elyase

+0

«UnivariateSpline» отлично подходит для данных, сделанных в вертикальном профиле, однако в моем случае данные берутся одновременно в разных местах, значения очень разные. Возможно, для моего решения требуется сочетание обоих подходов, сначала среднее, чтобы получить регулярно распределенный набор данных, и применить сплайн для получения плавной кривой. –

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