【发布时间】:2019-08-12 10:52:25
【问题描述】:
我正在使用 Boost Python 用 C++ 编写 Python 扩展模块。我想将模块中的 numpy 数组返回给 Python。它适用于像 double 这样的数字数据类型,但有一次我需要从现有数据创建一个 string 数组。
对于数值数组,我使用了PyArray_SimpleNewFromData,效果很好,但由于字符串不是固定长度,我使用PyArray_New,我可以传入项目大小,在我的案例4中。这是一个最小的例子:
bool initNumpy()
{
Py_Initialize();
import_array();
return true;
}
class Foo {
public:
Foo() {
initNumpy();
data.reserve(10);
data = {"Rx", "Rx", "Rx", "RxTx", "Tx", "Tx", "Tx", "RxTx", "Rx", "Tx"};
}
PyObject* getArray() {
npy_intp dims[] = { data.size() };
return (PyObject*)PyArray_New(&PyArray_Type, 1, dims, NPY_STRING, NULL, &data[0], 4, NPY_ARRAY_OWNDATA, NULL);
}
private:
std::vector<std::string> data;
};
我希望getArray() 的输出等于numpy.array(["Rx", "Rx" ...], dtype="S4") 的输出,即:
array([b'Rx', b'Rx', b'Rx', b'RxTx', b'Tx', b'Tx', b'Tx', b'RxTx', b'Rx',
b'Tx'], dtype='|S4')
但它看起来像这样:
array([b'Rx', b'', b'\xcc\xb3b\xd9', b'\xfe\x07', b'\x02', b'', b'\x0f',
b'', b'Rx\x00\x03', b''], dtype='|S4')
我尝试使用 npy_intp const* strides 参数,因为我认为问题在于基础数据的内存块。不幸的是,它没有达到我想要的结果。
我正在使用 Microsoft Build Tools 2017、Boost python、distutils 和 Python 3.7 来构建扩展。
【问题讨论】:
-
std::string往往被构造为指向数组的指针 + 一些元数据,因此将字符串数组的位置传递给 Numpy 是毫无意义的。不过我不确定如何解决这个问题
标签: python c++ numpy python-c-api