Fra*_*ter 5 python ctypes pointers multidimensional-array
我使用ctypes来访问python中读取C函数的文件.由于读取的数据量巨大且未知,因此我**float
在C中使用.
int read_file(const char *file,int *n_,int *m_,float **data_) {...}
函数mallocs
是一个称为data
适当大小的二维数组,在这里n
和m
,并将值复制到引用的值.请参阅以下代码段:
*data_ = data;
*n_ = n;
*m_ = m;
Run Code Online (Sandbox Code Playgroud)
我使用以下python代码访问此函数:
p_data=POINTER(c_float)
n=c_int(0)
m=c_int(0)
filename='datasets/usps'
read_file(filename,byref(n),byref(m),byref(p_data))
Run Code Online (Sandbox Code Playgroud)
之后我尝试p_data
使用contents
,但我只获得一个浮点值.
p_data.contents
c_float(-1.0)
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何data
在python中访问?
你推荐什么?如果我遗漏了一些不清楚的地方,请不要犹豫!
使用 python 库来完成整个事情可能会更简单struct
。但如果你热衷于 ctypes(我不怪你,这很酷):
#include <malloc.h>
void floatarr(int* n, float** f)
{
int i;
float* f2 = malloc(sizeof(float)*10);
n[0] = 10;
for (i=0;i<10;i++)
{ f2[i] = (i+1)/2.0; }
f[0] = f2;
}
Run Code Online (Sandbox Code Playgroud)
然后在Python中:
from ctypes import *
fd = cdll.LoadLibrary('float.dll')
fd.floatarr.argtypes = [POINTER(c_int),POINTER(POINTER(c_float))]
fpp = POINTER(c_float)()
ip = c_int(0)
fd.floatarr(pointer(ip),pointer(fpp))
print ip
print fpp[0]
print fpp[1]
Run Code Online (Sandbox Code Playgroud)
诀窍是大写字母POINTER
创建一个类型,小写字母pointer
创建一个指向现有存储的指针。你可以使用byref
而不是pointer
,他们声称它更快。我pointer
更喜欢,因为它更清楚正在发生的事情。
归档时间: |
|
查看次数: |
2020 次 |
最近记录: |