2017-03-10 14 views
0

私は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++の関数呼び出しから取得していた結果に基づいて動作していないようです。

誰かが間違っている可能性があることを知っていますか?

追加:int32float64の混合型の場合にこの方法を使用できますが、何らかの理由で文字列でうまく動作しないようです。 NumpyとCのヌル文字の適切な埋め込みと何か関係がありますか?

+1

私はcythonを知らないので、これは完全にオフかもしれませんが、すべての 'this_arr'への参照は保持されていますか? –

+0

あなたのC関数が 'void *'をキャストするデータのタイプを知っていますか?それは実際に一致する必要があります。 – DavidW

+0

@PaulPanzer私は同じことを考えましたが、私はそうだと思います。 'void *'を 'char *'としてコンソールに表示すると、それらはそのまま保持されていると思われます:) @DavidW C関数は 'void *'を適切な型にキャストすべきです。その機能のもう片面だが、確実に何が起こっているのかを知ることは難しい。これを特に困難にする原因の一部。私が知っていることは、このメソッドは何らかの理由でPython型 'int'と' float'の組み合わせで動作しますが、文字列では動作しないことです。 –

答えて

0

これは配列の配列でも、リストのリストでも、そのようなものでもありません。これは(2,3)配列で、各要素はポインタです。

In [1]: arr = np.array([[1,2,3],['Six','Ten','Rodger']], dtype = 'O') 
In [2]: arr 
Out[2]: 
array([[1, 2, 3], 
     ['Six', 'Ten', 'Rodger']], dtype=object) 
In [3]: arr.shape 
Out[3]: (2, 3) 
In [4]: arr[0,:] 
Out[4]: array([1, 2, 3], dtype=object) 
.... 

これらのポインタは、メモリ内の他の場所の整数または文字列を指しています。あなたはCythonで、やろうとしているように見えます

、申し訳ありません

In [16]: a2=np.zeros((2,),object) 
In [17]: a2[...] =[arr[0].astype(int), arr[1].astype(str)] 
In [18]: a2 
Out[18]: 
array([array([1, 2, 3]), 
     array(['Six', 'Ten', 'Rodger'], 
     dtype='<U6')], dtype=object) 

の同等の私は明白なことを述べている場合。私はcythonでスピードアップしようとしていますが、C++の部分に多くを取り込もうとはしません。そして、あなたのCythonコードの残りの部分がなければ、私はそれを実行することはできませんし、自分自身のために何が間違っているかを見てください。曖昧なものが間違っているということをあなたの言葉で伝えるだけです。