を@jit、ここに値を返すためにポインタを使用して簡単なC関数である:は、例えば
void add(double x, double y, double *r)
{
*r = x + y;
}
は、私はすべての要素に対してadd()
関数を呼び出したいですnumba @jit関数で結果を収集します。
!gcc -c -fpic func.c
!gcc -shared -o func.so func.o
をそしてctypesのことで、それをロードします:
は、最初のCコードをコンパイルし
lib = ctypes.cdll.LoadLibrary("./func.so")
add = lib.add
add.argtypes = ctypes.c_double, ctypes.c_double, ctypes.c_void_p
add.restype = None
その後、numba機能:
from numba import jit, float64
@jit(float64(float64[:], float64[:]))
def f(x, y):
z = np.zeros_like(x)
for i in range(x.shape[0]):
add(x[i], y[i], &z[i]) # here I want to pass the address of z[i]
return z
しかしnumbaにはAddressOf演算子や関数を持っていません。
現在、以下の方法を使用しています。しかし、このメソッドはnopythonモードでは使用できません。forループのコードにPythonオブジェクトがあるかどうかはわかりません。
@jit(float64(float64[:], float64[:]))
def f(x, y):
z = np.zeros_like(x)
tmp = ctypes.c_double(0.0)
addr = intp(ctypes.addressof(tmp))
val = carray(ctypes.pointer(tmp), 1)
for i in range(x.shape[0]):
add(x[i], y[i], addr)
z[i] = val[0]
return z
配列全体で動作するCラッパー関数を記述すると、Numbaはまったく必要ありません。 –
現在、私は仕事をするためにcythonを使用していますが、numbaに切り替えてこの問題を解決したいと思います。 – HYRY
FYI: 'add.argtypes = ctypes.c_double、ctypes.c_double、ctypes.POINTER(ctypes.c_double)'はより正確になります。そのパラメータを渡すには 'tmp = ctypes.c_double()'と 'add(1.0,2.0、ctypes.byref(tmp))'があります。 'tmp.value'が結果になります。 –