2012-04-12 4 views
5

У меня есть ряд развернутых фаз, с некоторыми разворачиванием ошибок, которые состоят из скачка +/- кратного Pi:Крепежной развертка фазы ошибки в Numpy

import numpy 
a = numpy.array([0.5, 1.3, 2.4, 10.3, 10.8, 10.2, 7.6, 3.2, 2.9]) 

В этом примере есть первый прыжок из 2 циклов между 2,4 и 10,3 и скачком -1 цикла между 7,6 и 3,2. Я хочу удалить прыжки. Уловка заключается в том, что при удалении прыжка вам нужно соответственно увеличить или уменьшить оставшуюся часть серии, а не только значение, в котором происходит скачок.

Есть уборщик способ (нет/меньше петель, быстрее) сделать это:

jumpsexist = 1 
while jumpsexist: 
    # Look for absolute differences greater than Pi 
    jump = numpy.abs((numpy.roll(a,-1) -a)) > numpy.pi 
    if jump[:-1].any(): 
     # Find the index of the first jump 
     jumpind = numpy.argmax(jump) + 1 
     # Calculate the number of cycles in that jump 
     cycles = ((a[jumpind] - a[jumpind- 1])/numpy.pi).astype("Int8") 
     # Remove the cycles 
     a[jumpind:] -= cycles * numpy.pi 
    else: 
     break 
+9

Обратите внимание, что переменная не называется «прыгать сексистские», но «скачками существует» , Я возьму слова за 200. – Benjamin

+3

В соответствии с вашими слабо выбранными именами переменных вы можете найти здесь функцию numpy 'cumsum'. Это кумулятивная сумма не ... неважно. – Hooked

+0

На стороне примечание, разворачивание фазы при наличии шума - открытая исследовательская проблема ... Вы бы не работали над данными InSAR, не так ли? –

ответ

8

NumPy предлагает функцию numpy.unwrap() для разворачивания фаз. При значениях параметра по умолчанию, он исправит массив фаз по модулю 2π, что все скачки меньше или равно я:

>>> a = numpy.array([0.5, 1.3, 2.4, 10.3, 10.8, 10.2, 7.6, 3.2, 2.9]) 
>>> numpy.unwrap(a) 
array([ 0.5  , 1.3  , 2.4  , 4.01681469, 4.51681469, 
     3.91681469, 1.31681469, 3.2  , 2.9  ]) 
+0

Изменено это на принятый ответ. Хотя непонятно в моем первоначальном вопросе, это действительно то, чем я был. – Benjamin

+0

@Benjamin: Я подозревал, что вы - вот почему я настаивал на том, чтобы вы четко изложили свои требования. :) –

2

Как об этом:

import numpy as np 
a = np.array([0.5, 1.3, 2.4, 10.3, 10.8, 10.2, 7.6, 3.2, 2.9]) 
d = np.diff(a)/np.pi 
b = np.empty_like(a) 
b[0] = a[0] 
b[1:] = a[1:]-(np.floor(np.abs(d))*np.sign(d)).cumsum()*np.pi 

, который дает:

In [40]: print a 
[ 0.5 1.3 2.4 10.3 10.8 10.2 7.6 3.2 2.9] 

In [41]: print b 
[ 0.5   1.3   2.4   4.01681469 4.51681469 3.91681469 
    1.31681469 0.05840735 -0.24159265] 

Здесь d удерживает подписанное значение «прыжков», а суммарное суммирование соответственно усеченных «прыжков» mulitple of pi, который необходимо удалить/добавить к каждому сложному элементу серии.

Это вы имели в виду?

+0

Прямо на. Для удобства чтения 'd = (numpy.diff (phase)/numpy.pi) .astype (" Int8 ")' и 'b [1:] = a [1:] - numpy.cumsum (d) * numpy.pi 'может быть яснее. – Benjamin

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

  • Нет связанных вопросов^_^