У меня есть существующая функция, которую я хотел бы адаптировать. В настоящее время он принимает массив с плавающей точкой, например,
[[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
Но я не могу понять синтаксис приведения массива для второй строки.