更新时间:2023-02-16 22:57:29
以下内容未经测试,因为我没有库代码,因此不得不猜测其工作方式。
The following is untested, because I don't have the library code and have had to take some guesses as to how it works. But it should give you an idea as to how you go about it.
我首先使用Python数组类型存储输入/输出。 标准库数组类型或numpy数组。这些将数组连续存储在内存中(就像C一样),因此只要可以指向 _FFIArray
data
属性
I'd start by using a Python array type to store your input/output. Either the standard library array type, or numpy arrays. These store the arrays continuously in memory (like C would) and so provided the _FFIArray
data
attribute can just be pointed at this memory for input.
def convert_bng(double[::1] x, double[::1] y):
# I'm assuming that the data is double, not float, but it's easy changed
# here the [::1] promises it's continuous in memory
cdef _FFIArray x_ffi, y_ffi
# get a pointer to the data, and cast it to void*
x_ffi.data = <void*>&x[0]
x_ffi.len = x.shape[0] # possibly *sizeof(double) - depends on the C api
# repeat for y
y_ffi.data = <void*>&y[0]
y_ffi.len = y.shape[0]
cdef _Result_Tuple result = convert_to_bng_threaded(x_ffi, y_ffi)
# get data pointers for the two result arrays
cdef double* e_ptr = <double*>(result.e.data)
cdef double* n_ptr = <double*>(result.n.data)
# now view your output arrays using memoryviews
# you need to tell it the length (this is how many doubles the contain)
cdef double[::1] e = <double[:result.e.len:1]>e_ptr
cdef double[::1] n = <double[:result.n.len:1]>n_ptr
# create a numpy copy of the two arrays
import numpy as np
e_numpy = np.copy(e)
n_numpy = np.copy(n)
# you can now free your two returned arrays
# I assume this is done with drop_float_array
drop_float_array(result.e,result.n)
# return as tuple containing two arrays to python
return e_numpy, n_numpy