2013-05-03 2 views
2

У меня есть массив numpy, содержащий разрывы различных размеров. Я хотел бы заполнить меньшие промежутки размера < N с линейной интерполяцией.идентификация размера зазора в массиве 1D numpy

Другими словами для:

N = 2 

и

x = np.array([10., 20., np.nan, 40., 50., np.nan, np.nan, np.nan, 10.,0.,-10.]) 

Я хотел бы, чтобы заполнить третью позицию (индекс 2) с 30,0.

Я открыт для алгоритмических подходов, но мое намерение состояло в том, чтобы создать массив, который будет индикатором размера локального разрыва:

[0 0 1 0 0 3 3 3 0 0] 

или разрыв слишком большой:

[0 0 0 0 0 1 1 1 0 0] 

С этим в руке я могу записывать показатели недостатков, которые достаточно малы и использовать interp1d. Есть ли экономичный, функциональный способ сделать это? Я знаю, как это сделать с помощью цикла с предварительным знаком.

Спасибо,

Эли

+0

Таким образом, в первом массиве (' [0 0 1 0 0 3 3 3 0 0] ')' 1' и '3' указывают количество последовательных элементов без« правильного »номера? – SethMMorton

+0

Точно, SethMMorton. –

ответ

0

Я не уверен, если это именно то, что вы ищете, но это мое предложение:

>>> import numpy as np 
>>> from itertools import groupby 
>>> 
>>> x = np.array([10., 20., np.nan, 40., 50., np.nan, np.nan, np.nan, 10.,0.,-10.]) 
>>> y = np.zeros_like(x, dtype=int) 
>>> y[np.where(np.isnan(x))] = 1 # Locate where the array is nan 
>>> y 
array([0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0]) 
>>> z = [] 
>>> for a, b in groupby(y, lambda x: x == 0): 
...  if a: # Where the value is 0, simply append to the list 
...   z.extend(list(b)) 
...  else: # Where the value is one, replace 1 with the number of sequential 1's 
...   l = len(list(b)) 
...   z.extend([l]*l) 
>>> z 
[0, 0, 1, 0, 0, 3, 3, 3, 0, 0, 0] 
Смежные вопросы