cython — инициализировать 2d c-массив

Я хотел бы создать 2D-массив в функции cdef с количеством элементов в каждом измерении в зависимости от параметров, переданных в функцию. Например.:

cdef int[:,:] c_volumecheck(int n):

    cdef:
        const int comb = 2**n
        const int nt = n
        int match[comb][nt] 
        size_t i,j

    # initialize values
    for i in range(comb):
        for j in range(n):
            match[i][j] = 0


return match

Однако назначение константного выражения comb и nt, похоже, не работает, поскольку я получаю сообщение об ошибке «Не разрешено в постоянном выражении» в строке int match[comb][nt]. Ручное задание соответствующих значений работает (match[8][3], например, n=3). Однако это не вариант, так как эти значения меняются во время работы программы.

Во-вторых, я, похоже, не понимаю, как вернуть этот массив в другую функцию cdef или def в том же .pyx-скрипте: int[:,:] не соответствует 2d-массиву, подобному тому, который я хочу инициализировать.


person user3820991    schedule 05.06.2017    source источник
comment
int[:,:] — это синтаксис для типизированного представления памяти; Я предлагаю прочитать/поэкспериментировать с этой страницей документа: cython.readthedocs.io/ ru/latest/src/userguide/memoryviews.html   -  person hpaulj    schedule 05.06.2017
comment
поверьте, я не поленился написать свой вопрос. Но я не смог найти ссылку о том, как вернуть массив. Однако, ознакомившись с c-turorials, может оказаться, что это не предназначено чтобы иметь возможность возвращать массивы, поскольку вы не можете сделать это и в C, только указатели на массивы.   -  person user3820991    schedule 05.06.2017
comment
Можете ли вы объяснить, что должна видеть вызывающая функция? Это чисто операция уровня C или вы ожидаете вернуть что-то полезное для кода Python (списки, массивы numpy)?   -  person hpaulj    schedule 05.06.2017
comment
он должен возвращаться к функции def в скрипте `pyx'. Вероятно, я мог бы сохранить его в среде «cdef». Но я определенно не буду использовать значение вне cython.   -  person user3820991    schedule 06.06.2017
comment
Тогда это просто стандартное кодирование c, немного измененное синтаксисом cython?   -  person hpaulj    schedule 06.06.2017
comment
да, я так и думал.   -  person user3820991    schedule 06.06.2017
comment
Это означает, что вы не можете вернуть массив или представление памяти, как на уровне C. Однако вы можете передавать указатели. Вы можете частично оптимизировать свой код, сохранив его как функцию определения и вернув массив NumPy. Это позаботится о распределении памяти, полезном побочном продукте. Для вашего примера: cdef double[:,:] myarray = np.zeros((2**n, n)) заменит часть инициализации вашей функции.   -  person Pierre de Buyl    schedule 06.06.2017
comment
stackoverflow .com/questions/25917593/ предлагает представления памяти в качестве альтернативы статическим массивам C.   -  person hpaulj    schedule 06.06.2017