私は文字列として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パラメータを正しく設定する方法がわかりません。どんな形式のガイダンスにも感謝します。
「S5」dtypeは5バイトとして格納されます。 「U5」は4×5バイトである。 py3では、デフォルトの文字列がunicodeです。バイトストリングは 'b'フラグで表示されます。py2では、余分なフラグを取得するのはユニコードです。 – hpaulj