3

double ** に 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でポインタのポインタを宣言する方法は?】

手伝ってくれてありがとう

-バコ

編集 - 悪い/低い 解決策:

このループを回避する唯一の方法は、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