Cython.Ошибка за границей - PullRequest
1 голос
/ 24 ноября 2011

Я написал следующий код Cython, который будет использоваться при анализе моих исследований.

def jumprate(np.ndarray[FTYPE_t, ndim=1] X ,np.ndarray[LTYPE_t, ndim=1] V):

cdef np.ndarray J = np.zeros([X.shape[0]], dtype=LTYPE)
cdef np.ndarray O = np.zeros([X.shape[0]], dtype=LTYPE)
cdef np.ndarray Vel = np.zeros([X.shape[0]], dtype=FTYPE)    
cdef  long  j=0 # index of J
cdef  long  o=0# index of O
cdef  long  k = 0 # index of X
cdef  long l = 0 # counts length of sequence of same velocity sign
cdef  long  L = V.shape[0]/3
cdef  int jumpstart = 1
cdef  int jumpend = 1    
cdef  long S0 = 0    

while k <  L:  # run over position array
    if V[k]==V[k-1]: # might be a start of jump
        jumpstart = k  # Also where last oscilation ended    
        S0 = V[k]
        while V[k]==S0: # As long as velocity sign doesn't change we might be in a jump
            l += 1 # Count sequences length
            k += 1 # Update position in array
    if int(X[jumpstart]) != int(X[k]): # If start end ending point of sequence are 
                                     # in different grid squares, it's a jump
        J[j] = l # Append jump length to list 
        j += 1
        Vel[j] = (jumpstart-jumpend)/100
        O[o] = abs((jumpend-jumpstart))  # Append oscilation length to list 
        o += 1
        l = 0 
        jumpend = k # mark where last jump ended (also where new oscilation starts)
    k+=1    
return J,O,Vel

Обратите внимание на определение L в 9-й строке деления на 3. Я вставил его после получения следующей ошибки во время выполнения

while V[k]==S0: # ...
IndexError: Out of bounds on buffer access (axis 0) 

Какого рода проблема решена. Однако в массиве X, V, переданном функции, содержится 99990 элементов, и это решение означает, что используются только первые 33330. Сначала я хотел просто изменить тип с int на long, но это не помогло.

Может кто-нибудь предложить решение проблемы?

Для тех, кто интересуется целью кода, он предназначен для следования траектории атома (массива X), который колеблется в потенциальной яме несколько раз и перепрыгивает из одной скважины в другую в другое время. Функция «jumprate» возвращает два массива, которые содержат длины (во времени) последовательностей чередующегося прыжка и колебательного движения.

1 Ответ

2 голосов
/ 06 декабря 2011

k инициализируется с 0, и вы пытаетесь получить доступ к V[k -1] массива numpy в

while k <  L:  # run over position array
    if V[k]==V[k-1]: # might be a start of jump
...