10

NumPy 配列を操作するために、Python から C 関数を呼び出したいと思います。関数は次のようになります。

void c_func(int *in_array, int n, int *out_array);

結果はout_arrayで提供され、そのサイズは事前にわかっています(実際には関数ではありません)。NumPy配列から関数に入力を渡し、結果をNumPy配列に保存できるようにするために、対応する.pyxファイルで次のことを試みます。

def pyfunc(np.ndarray[np.int32_t, ndim=1] in_array):    
    n = len(in_array)
    out_array = np.zeros((512,), dtype = np.int32)
    mymodule.c_func(<int *> in_array.data, n, <int *> out_array.data)
    return out_array

しかし "Python objects cannot be cast to pointers of primitive types"、出力割り当てでエラーが発生します。どうすればこれを達成できますか?

(Python の呼び出し元が適切な出力配列を割り当てる必要がある場合は、それを行うことができます。

def pyfunc(np.ndarray[np.int32_t, ndim=1] in_array, np.ndarray[np.int32_t, ndim=1] out_array):  
    n = len(in_array)
    mymodule.cfunc(<int *> in_array.data, n, <int*> out_array.data)

しかし、呼び出し元が適切なサイズの出力配列を事前に割り当てる必要がないように、これを行うことはできますか?

4

2 に答える 2

5

cdef np.ndarray割り当ての前に追加する必要がありout_arrayます。

def pyfunc(np.ndarray[np.int32_t, ndim=1] in_array):    
    cdef np.ndarray out_array = np.zeros((512,), dtype = np.int32)
    n = len(in_array)
    mymodule.c_func(<int *> in_array.data, n, <int *> out_array.data)
    return out_array
于 2012-04-10T08:09:25.743 に答える
1

以下は、ctypes を介して C/C++ で記述されたコードを使用して NumPy 配列を操作する方法の例です。最初の配列から数値の 2 乗を取得し、その結果を 2 番目の配列に書き込む小さな関数を C で作成しました。要素の数は、3 番目のパラメーターによって指定されます。このコードは共有オブジェクトとしてコンパイルされます。

squares.c を squares.so にコンパイル:

void square(double* pin, double* pout, int n) {
    for (int i=0; i<n; ++i) {
        pout[i] = pin[i] * pin[i];
    }
}

Python では、ctypes を使用してライブラリをロードし、関数を呼び出すだけです。配列ポインターは、NumPy ctypes インターフェイスから取得されます。

import numpy as np
import ctypes

n = 5
a = np.arange(n, dtype=np.double)
b = np.zeros(n, dtype=np.double)

square = ctypes.cdll.LoadLibrary("./square.so")

aptr = a.ctypes.data_as(ctypes.POINTER(ctypes.c_double))
bptr = b.ctypes.data_as(ctypes.POINTER(ctypes.c_double))
square.square(aptr, bptr, n)

print b

これはどのc-libraryでも機能します。渡す引数の型を知る必要があるだけで、ctypesを使用してpythonでc-structを再構築する可能性があります。

于 2012-04-08T17:03:48.173 に答える