Cython: Как эффективно суммировать объект memoryviewslice? - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь ускорить функцию, которая вычисляет сумму всех элементов [целое число] справа от каждого элемента в матрице и проверяет, является ли сумма четной. Я пытался использовать Cython (представления памяти), но я делаю все хуже. : D Я думаю, я не правильно понимаю определения типов, как я получаю, например, «Pyx_PyInt_From_npy_long» в html-файле для строки wm [i, j] = (gx [i:, j] .sum ())% 2, который я считал всем npy_long.

import numpy as np
cimport numpy as np
cimport cython

ctypedef np.int_t dtype_int

@cython.wraparound(False)  
@cython.boundscheck(False) 
def test_fun(np.ndarray[dtype_int,ndim=2]  gx_in, dtype_int n):
    # Declarations
    cdef dtype_int i,j  
    cdef dtype_int[:,:] gx
    cdef dtype_int[:] gx_slice
    gx = gx_in

    # Init Array
    wm_init = np.zeros((n,n), dtype = np.int)
    cdef dtype_int[:,:] wm = wm_init

    # Loop
    for i in range(n):
        for j in range(n):
            gx_slice = gx[i:,j]
            wm[i,j] = np.sum(gx_slice)%2
    return wm

Я использовал np.sum () вместо .sum () (который был быстрее), потому что объект memoryviewslice, по-видимому, не имеет атрибута sum.

1 Ответ

0 голосов
/ 14 сентября 2018

Я нашел способ ускорить цикл (вставьте явный цикл для суммы). Это сработало для моего случая, и я думаю, что это как-то связано с нарезкой, хотя я не уверен.

ctypedef np.int_t dtype_int
@cython.wraparound(False)  
@cython.boundscheck(False) 
def test_fun(np.ndarray[dtype_int,ndim=2]  gx_in, dtype_int n):
    # Declarations
    cdef dtype_int i,j,k, gx_sum    
    cdef dtype_int[:,:] gx
    cdef dtype_int[:] gx_slice
    gx = gx_in

    # Init Array
    wm_init = np.zeros((n,n), dtype = np.int)
    cdef dtype_int[:,:] wm = wm_init

    # Loop
    for i in range(n):
        for j in range(n):
            gx_sum = 0
            for k in range(i,n):
                gx_sum += gx[k,j]

            wm[i,j] = gx_sum%2
    return wm
...