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)