我想知道如何使用ndpointer作为双**。
考虑顶点矩阵[100000] [3]和C中的函数,如:
double dist(double **vertex)
要从C调用此函数,我需要创建以下指针矩阵:
double **b=(double **)malloc(sizeof(double)*100000);
for (i=0;i<100000;i++)
{
b[i]=(double*)malloc(sizeof(double)*3);
}
如果我使用ctypes从python调用这个dist函数,我需要做类似的事情:
import numpy as np
import ctypes
vertex_np=np.reshape(np.random.randn(nb_millions*3e6),(nb_millions*1e6,3))
pt=ctypes.POINTER(ct.c_double)
vertex_pt= (pt*len(vertex_np))(*[row.ctypes.data_as(pt) for row in vertex_np])
result=lib.dist(ctypes.pointer(vertex_pt))
问题是创建vertex_pt的循环...
如何使用numpy.ctypeslib中的ndpointer来避免这个循环? [如何使用numpy.ctypeslib.ndpointer声明指针指针?]
感谢您的帮助
-baco
编辑 - BAD / LOW解决方案:
我发现避免这种循环的唯一方法是用以下方法修改dist的声明:
double dist(double (*vertex)[3])
然后我可以在python代码中使用ndpointer:
lib.dist.argtypes = [np.ctypeslib.ndpointer(ndim=2,shape=(100000,3))]
result=lib.dist(vertex_np)