Преобразовать указатель и длину void в непрерывное 1D-типизированное представление памяти в Cython - PullRequest
0 голосов
/ 25 марта 2020

У меня есть существующая функция, которую я хотел бы адаптировать. В настоящее время он принимает массив с плавающей точкой, например,

[[1.0, 1.5], [2.2, 3.2], …]

Передает его в мою функцию ffi в виде пустого указателя и длины и возвращает преобразованный результат обратно. Это работает отлично. Однако мне нужно адаптировать это для второй функции, которая принимает той же формы массива, но возвращает результатов в виде пустого указателя на непрерывный 1D массив int (например, [1, 4, …]) и длина. Возвращенные данные могут быть короче входных данных.

Это моя текущая функция:

struct Array:
    void* data
    size_t len


def foo(coords):
    cdef double[:,::1] ncoords = np.array(coords, dtype=np.float64)
    cdef Array coords_ffi
    coords_ffi.data = <void*>&ncoords[0, 0]
    coords_ffi.len = ncoords.shape[0]
    # mutate
    cdef Array result = foo_ffi(coords_ffi)
    # convert back from pointer to coords e.g. [[1.0, 2.0], [2.1, 2.2], … ]
    cdef double* incoming_ptr = <double*>(result.data)
    cdef double[:, ::1] view = <double[:result.len,:2:1]>incoming_ptr

    if isinstance(coords, numpy.ndarray):
        outgoing = np.copy(view)
    else:
        outgoing = np.copy(view).tolist()
    drop_float_array(result)
    return outgoing

Поэтому мне нужно изменить строки:

    cdef double* incoming_ptr = <double*>(result.data)
    cdef double[:, ::1] view = <double[:result.len,:2:1]>incoming_ptr

, чтобы что-то вроде

cdef int* incoming_ptr = <int*>(result.data)
cdef int[???] view = <int[:result.len, ??]>incoming_ptr

Но я не могу понять синтаксис приведения массива для второй строки.

...