我有一个C++回调函数,它使用CyType调用Python。此函数的参数是指向double数组和元素数的指针。
有很多元素,大约200万。我需要把这个发送到scipy函数中。
< > C++原型是:bool (*ptsetDataSource)(double*, long long);
以下是python代码:
CPF_setDataSource = CFUNCTYPE(c_bool, POINTER(c_double),c_longlong)
CPF_setSelection= CFUNCTYPE(c_bool,c_char_p, c_longlong,c_longlong)
CPF_ResetSequence = CFUNCTYPE(c_bool)
def setDataSource(Data, DataLength):
Datalist=[0.0]*100
for i in range(0,100):
Datalist[i]=Data[i]
print Datalist
return True
问题是print datalist返回:
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
这是不正确的(当在c++端检查时,数据中会填充很多其他数字)。
另外,如果我使用此代码将数据转换为python列表,它会在分配步骤锁定计算机。
无论如何,是否要从C++数组加载数据,然后将其转换成适合SCIPY的数组?
如果
Data
是(c_double*DataLength.value)
数组,则可以:如果} 获得numpy数组。这与你的问题相同,但速度更快:
Data
是POINTER(c_double)
,则可以使用^{要在不复制的情况下从} 方法:
POINTER(c_double)
实例创建numpy数组,可以使用^{或者
两个方法都将} 。
POINTER(c_double)
实例转换为(c_double*DataLength)
,然后将其传递给^{基于Cython的解决方案
下面是Python的C扩展模块(用Cython编写),它将转换函数作为C API提供:
它可以与
ctypes
一起使用,如下所示:其中} 。
call_callback
是:^{相关问题 更多 >
编程相关推荐