Функция Python работает ровно дважды, а затем застревает в бесконечном цикле - PullRequest
0 голосов
/ 15 марта 2019

Я посмотрел на многие другие вопросы, но не смог найти то, что мне было нужно, поэтому извините, если это повторение.

Я использую Python 2.7 через Jupyter Notebook, и я сделал функцию дляпросмотрите мои данные, чтобы избавиться от очевидных ужасных всплесков (делая эти местоположения NaN).Функция прекрасно работает дважды (графики именно то, что я хочу, я не включила их сюда, потому что они кажутся неактуальными), но затем она застревает и не увеличивает мои счетчики или делает что-либо кроме печати переменных, которые я использую для проверкичто происходит в моем коде.Я также должен очистить все ядра и перезапустить все предыдущие ячейки перед запуском этого раздела, иначе он застрянет на самой первой итерации.

Мне нужно использовать эту функцию 8 раз в моем скрипте, и этопросто невозможно в данный момент.Я довольно новичок в Python, поэтому я надеюсь, что есть очевидное исправление, которое я просто не вижу.

Вот функция:

def testCR(Acr,binscr,errincr,lamcr,mcr):
    LengthOut = int(np.ceil((lamcr[-1]-lamcr[0])/binscr))
    print('len(Acr)=',len(Acr))
    SpecTestcr = Acr
    LamTestcr = lamcr
    ErrTestcr = errincr
    k = 1
    i = 0
    j = 0
    while i <= len(Acr)-1:
        while lamcr[j] <= lamcr[0]+(k*binscr) and lamcr[j] <= lamcr[-1]:
            j += 1
            if j >= len(lamcr):
                break
        print('j=',j)
        testcr = Acr[i:j-1]
        dcr = np.abs(testcr - np.median(testcr))
        mdevcr = np.median(dcr)
        scr = np.divide(dcr,mdevcr) if mdevcr else [0] * len(dcr)
        print('len testcr=',len(testcr))
        print('mdevcr=',mdevcr)
        for q in range(len(testcr)):
            if scr[q] >= mcr:
                SpecTestcr[i+q] = np.nan
                ErrTestcr[i+q] = np.nan
                LamTestcr[i+q] = np.nan
        i = j
        k += 1
        if (i >= len(Acr)-1) or (j >= len(Acr)-1):
            break
    return SpecTestcr, LamTestcr, ErrTestcr

И вот как она возвращается после вызоваэто:

#Start of Call 1
('len(Acr)=', 2030)
('j=', 166)
('len testcr=', 165)
('mdevcr=', 0.014701925686341571)
('j=', 332)
('len testcr=', 165)
('mdevcr=', 0.01341256599231086)
# lots out outputs that are redundant
#Start of Call 2
('len(Acr)=', 2030)
('j=', 166)
('len testcr=', 165)
('mdevcr=', 0.016135353935591987)
# deleted many outputs here
('j=', 2030)
('len testcr=', 41)
('mdevcr=', 0.039457538527604724)
#Start of Call 3
('len(Acr)=', 2030)
('j=', 166)
('len testcr=', 165)
('mdevcr=', 0.014498302694355033)
('j=', 166)
('len testcr=', 0)
('mdevcr=', nan)
('j=', 166)
('len testcr=', 0)
('mdevcr=', nan)
('j=', 166)
('len testcr=', 0)
('mdevcr=', nan)

И эти последние несколько строк повторяются вечно, пока я не остановлю код.

Любая помощь очень ценится!Заранее благодарим вас за ваше время!

Редактировать:

В качестве примера, вот как я называю это 3 разные времена:

B0crtest,lam0crtest,Err0crtest=testCR(A0,Bins,A0err,A0oL,2)
B45crtest,lam45crtest,Err45crtest=testCR(A45,Bins,A45err,A45oL,2)
B225crtest,lam225crtest,Err225crtest=testCR(A225,Bins,A225err,A225oL,2)

Различные номера (045 и 225 (22,5)) - это просто разные полуволновые углы пластин, с которыми были взяты данные.

Чтобы увидеть, что делает функция (когда она работает правильно), поверните первый график (ниже) всекунда.

График после функции

График после функции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...