2017-07-16 40 views
0

pybind11 C++ APIとpython3を使用して、C++実装でnumpyのオブジェクト(つまりユニコード文字列)の配列を適切に作成し、Pythonに戻すにはどうすればよいですか? pybind11 :: array()に渡される、基礎となるデータ配列の正確なメモリレイアウトは何ですか?どのように正確にメモリを管理する必要がありますか?削除/無料ですか?pybind11戻り値numpyオブジェクトの配列

これは、パンダのDataFrame作成で、他のPOD配列と組み合わせてその文字列配列を使用する必要があるためです。

+2

私は助けることができません'pybind11'。しかし 'numpy'配列は' numpy C API'関数で作成することができます。配列のレイアウトはすべて基本的に同じですが、属性とデータバッファです。オブジェクト型の場合、データバッファにはオブジェクトのポインタがメモリ内の他の場所に格納されます。 'unicode'型のバッファは、実際には文字列を含みます(指定された長さにパディングされています)。 'numpy'文書を調べなければならないかもしれません。 – hpaulj

+0

ありがとう - それは最良の方法のように手動でオブジェクトを持つバッファを作成し、どのようにpybind11メモリを管理することができます基本的な配列だけでなく、すべてのオブジェクトに関連付けられているようだ... –

答えて

0

は、それがする必要があることが判明:

  1. すなわち

    auto* pbuf = new PyObject*[arraySize]; // or create via pybind11 API... 
    pbuf[0] = <new object...> 
    pbuf[1] = <new object...> 
    etc. 
    
  2. 、配列を埋める、PyObjectポインタの配列を作成する "オブジェクト" PY ::配列を(作成)カプセルで:

    py::capsule freeWhenDone(pbuf, [](void* pp) { 
         delete [] (PyObject*)pp; // or else properly free the pbuf memory 
        }); 
    
    arr = py::array(py::dtype("object"), 
        shape, strides, pbuf, freeWhenDone); 
    
関連する問題