3

我想知道如何将 ndpointer 用于双 **。

考虑一个 vertex[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

编辑 - 坏/低解决方案:

我发现避免这个循环的唯一方法是修改 dist 的声明:

double dist(double (*vertex)[3])

然后我可以在 python 代码中使用 ndpointer:

lib.dist.argtypes = [np.ctypeslib.ndpointer(ndim=2,shape=(100000,3))]
result=lib.dist(vertex_np)
4

0 回答 0