私はdtype = 'object'であると宣言した混合型の2次元ナンパー配列を持っています。これは私が知る限り最も一般的なdtypeですつかいます。私は空隙に、この2次元配列に変換する必要Cythonラッパーでvoid **に複素数型のCython 2次元numpy配列**
arr = np.array([[1,2,3],['Six','Ten','Rodger']], dtype = 'O')
** C++側の関数シグネチャを満足させるためにアレイ。私はdtype = 'O'
を選択したので、割り当てられたメモリは必要以上に大きくなり、現在の形式で関数に正しく渡されないことに気付きました。
2番目の次元の配列の型は常に一致しています。 データ構造に渡される他の情報から、これらの型のそれぞれを知る方法があります。私はその後、numpy.asarray
を用いた二次アレイの各々を変換し、対応するvoid*
arr = np.array([[1,2,3],['Six','Ten','Rodger']], dtype = 'O')
num_entries = arr.shape[1]
cdef void** ptr_arr = <void**> malloc(arr.shape[0]*sizeof(void*))
cdef np.ndarray this_arr
cdef DataType type
for i in range(num_entries):
type = get_type(tags[i]) # this is where the data's dtype is collected
### i = 0 -> dtype is int i = 1 -> dtype is 'S6' ###
this_arr = np.asarray(arr[i], dtype = type)
ptr_arr[i] = <void*> this_arr.data
を設定し...しかし、これは私が戻ってC++の関数呼び出しから取得していた結果に基づいて動作していないようです。
誰かが間違っている可能性があることを知っていますか?
追加:int32
とfloat64
の混合型の場合にこの方法を使用できますが、何らかの理由で文字列でうまく動作しないようです。 NumpyとCのヌル文字の適切な埋め込みと何か関係がありますか?
私はcythonを知らないので、これは完全にオフかもしれませんが、すべての 'this_arr'への参照は保持されていますか? –
あなたのC関数が 'void *'をキャストするデータのタイプを知っていますか?それは実際に一致する必要があります。 – DavidW
@PaulPanzer私は同じことを考えましたが、私はそうだと思います。 'void *'を 'char *'としてコンソールに表示すると、それらはそのまま保持されていると思われます:) @DavidW C関数は 'void *'を適切な型にキャストすべきです。その機能のもう片面だが、確実に何が起こっているのかを知ることは難しい。これを特に困難にする原因の一部。私が知っていることは、このメソッドは何らかの理由でPython型 'int'と' float'の組み合わせで動作しますが、文字列では動作しないことです。 –