我正在使用Python(通过)包装C库来运行一系列计算。在运行的不同阶段,我想将数据导入Python,特别是数组。从ctypes数组获取数据到numpy
我使用的包装做了两种不同类型的返回数组数据(这是特别感兴趣的是我)的:
阵列:当我做
type(x)
(其中x是数组,我得到的回报一个<class 'module_name.wrapper_class_name.c_double_Array_12000'>
我知道这个数据是从文档内部数据的副本,我能够把它变成一个numpy
阵列容易:>>> np.ctypeslib.as_array(x)
这将返回一个1D numpy
数组数组。
ctype
指针数据:在这种情况下,从库中的文档,我明白,我得到一个指针存储并直接使用库中的数据。乳清我做type(y)
(其中y是指针)我得到<class 'module_name.wrapper_class_name.LP_c_double'>
。有了这个情况下,我仍然能够通过像y[0][2]
数据索引,但我通过一个超级尴尬才能够让它进入numpy的:>>> np.frombuffer(np.core.multiarray.int_asbuffer( ctypes.addressof(y.contents), array_length*np.dtype(float).itemsize))
我发现这在一个旧numpy
邮件列表thread from Travis Oliphant ,但不在numpy
文档中。如果不是这样的做法我尝试如上我得到以下几点:
>>> np.ctypeslib.as_array(y)
...
... BUNCH OF STACK INFORMATION
...
AttributeError: 'LP_c_double' object has no attribute '__array_interface__'
这是np.frombuffer
方法来做到这一点的最好或唯一途径?我愿意接受其他建议,但必须仍然希望使用numpy
,因为我有许多其他后处理代码依赖于numpy
功能,我想使用此数据。
你有控制输出是否是C lib?你可以改变图书馆的API吗? – 2010-12-04 20:03:09
是的 - 我有消息来源。我不确定要走哪条路,因为指针方法允许Python直接对数据进行操作,我认为在某些情况下这可能是一个优势。在我的情况下,是的,将所有内容作为`ctype`数组出现将是一个优势。任何建议? – dtlussier 2010-12-04 20:09:49
我建议让库使用你在Python中分配的(NumPy-)数组并传递给库。这样,你可以采取相同的记忆,但你不必费心去做任何尴尬的转换。你已经有了一个NumPy数组,并且将它传递给一个库可以通过使用[`numpy.ctypeslib.ndpointer`]得到很好的支持(http://docs.scipy.org/doc/numpy/reference/routines.ctypeslib.html #numpy.ctypeslib.ndpointer)作为参数类型传递给函数的ctypes包装。 (如果这不清楚,只是问...) – 2010-12-04 20:46:16