2016-08-31 14 views
0

私は文字列としてCで表されるいくつかのデータを扱っています。私はこのデータに基づいて数が少ない配列を返したいと思います。しかし、私は配列がdtype = 'SX'を持つことを望みます.Xは実行時に決定される数値です。C-numpy:固定幅文字列のデータ型を設定していますか?

これまでのところ私はそうのようなCのデータをコピーしています:あなたが見ることができるように

buffer_len_alt = (MAX_WIDTH)*(MAX_NUMBER_OF_ITEMS); 
    output_buffer = (char *) calloc(sizeof(char), buffer_len_alt); 
    column = PyArray_SimpleNewFromData(1, &buffer_len_alt, NPY_BYTE, output_buffer); 
    if (column == NULL){ 
     return (PyObject *) NULL; 
    } 
    /* Put strings of length MAX_WIDTH in output_buffer */ 
    return column; 

、私は「列」はバイトの1次元配列であることを、PyArray_SimpleNewFromDataを語っていますので、ポインタは、私たちが呼び出されたとき「B」の接頭辞が、彼らはまだ、バイト配列として解釈されている私に語ったが、私は代わりに文字列を持つようにしたい

print(col) 
>> array([48, 0, 0, 50, 48, 48, 48, 0, 0, 50, 48, 48, 50, 48, 48, 48, 0, 0], dtype=int8) 
print(col.view('S3')) 
>> array([b'0', b'200', b'0', b'200', b'200', b'0'], dtype='|S3') 

「0」、 ":「欄には、」我々はこれを見たPythonオブジェクトのコル」になります200 "などとなる。この例では文字列が数字であるが、必ずしもそうであるとは限らない。

個々のバイトオブジェクトを文字列に変換するためにb'200'.decode(format)を個別に呼び出すことはできますが、Cの拡張機能をnumpyに書き込むことは、Cで実行されるすべてのループを取得することでした古いchararrayインタフェース(現在は廃止予定です)では、配列のすべてのシーケンスをデコードするarray.decodeメソッドも提供されていますが、numpy-Cインタフェースから返されるオブジェクトも単純なndarraysです。

質問 Pythonが正しいタイプの情報(例えばDTYPE =「S5」)を用いて配列を受け取るようにtypenum私はSimpleNewFromData代わりのNPY_BYTEに渡すべきですか?

また、SimpleNewFromDataでtypenumを達成できない場合は、SimpleNewFromDescrを使用する必要があるかもしれませんが、PyArray_Descrパラメータを正しく設定する方法がわかりません。どんな形式のガイダンスにも感謝します。

+0

「S5」dtypeは5バイトとして格納されます。 「U5」は4×5バイトである。 py3では、デフォルトの文字列がunicodeです。バイトストリングは 'b'フラグで表示されます。py2では、余分なフラグを取得するのはユニコードです。 – hpaulj

答えて

1

私はコードの一部であるCに慣れていませんが、バイト文字列とユニコード文字列の表現が混乱しているようです。 b'200'の表示は、Py3で作業していることを示しています。ここで、Unicodeはデフォルトの文字列型です。

PY3セッションで:

生のバイト:

In [482]: x=np.array([48, 0, 0, 50, 48, 48, 48, 0, 0, 50, 48, 48, 50, 48, 48, 48, 0, 0], dtype=np.int8) 

は3つのバイト文字列を見ました。 PY2セッションでは、bは使用されません。しかし、その見方は同じです。

In [483]: x.view('S3') 
Out[483]: 
array([b'0', b'200', b'0', b'200', b'200', b'0'], 
     dtype='|S3') 

viewは、データバッファを変更しませんが、astypeは、必要に応じて要素を変換し、新しいデータバッファを使用して新しい配列を作ることができます。

In [484]: x.view('S3').astype('U3') 
Out[484]: 
array(['0', '200', '0', '200', '200', '0'], 
     dtype='<U3') 
In [485]: x.view('S3').astype('U3').view(np.uint8) 
Out[485]: 
array([48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 48, 
     0, 0, 0, 48, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 50, 0, 0, 0, 48, 0, 0, 0, 48, 0, 0, 0, 50, 0, 0, 
     0, 48, 0, 0, 0, 48, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0], dtype=uint8) 

ユニコードバージョンでは、バッファに72バイト、文字あたり4バイトがあります。

np.charは、依然として文字列メソッドをSU型配列に適用します。 np.char.decodeastypeと同じことを行います。

In [489]: np.char.decode(x.view('S3')) 
Out[489]: 
array(['0', '200', '0', '200', '200', '0'], 
     dtype='<U3') 
関連する問題