如何使用numpy.ndpointer为c语言python调用从C声明一个double **?

时间:2013-03-27 10:10:49

标签: python c numpy ctypes

我想知道如何使用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)

0 个答案:

没有答案