简体   繁体   English

Numpy C扩展:访问PyArrayObject中的PyObject

[英]Numpy C extension: Access PyObjects in a PyArrayObject

I created a pandas dataframe with pd.DataFrame({"A": ["dog", "cat"]}) and sent to ac extension the resulting numpy array. 我使用pd.DataFrame({“ A”:[“ dog”,“ cat”]})创建了一个熊猫数据框,并将其发送给ac扩展以生成numpy数组。 In C, I do: 在C中,我这样做:

PyArrayObject * pArray = (PyArrayObject *) pArrayObj;
PyArray_Descr * pDesc = PyArray_DTYPE(pArray);
int kind = pDesc->kind;
npy_intp sz = PyArray_DIM(pArray, 0);
PyObject * p0 = (PyObject *) PyArray_GETPTR1(pArray, 0);

In the above 'kind' contains 'O' (for object array) and sz = 2 (as expected). 在上面的“种类”中包含“ O”(对于对象数组)和sz = 2(按预期)。 However p0 does not seem to access the first object: 但是p0似乎没有访问第一个对象:

(gdb) p *p0
$10 = {ob_refcnt = 140737227161872, ob_type = 0x7ffff06e8180}

Notice corrupted refcnt and unresolved ob_type (was expecting PyUnicode_Type). 请注意,refcnt已损坏,ob_type无法解析(原本是PyUnicode_Type)。

Any suggestions to correctly obtain a pointer to each element? 有什么建议可以正确获取指向每个元素的指针?

I'm using numpy 1.14 on Centos 7, g++ 6.2.1 我在Centos 7,G ++ 6.2.1上使用numpy 1.14

Figured out how to do it: 想通了怎么做:

npy_intp stride = PyArray_STRIDE(pArray, 0);
const char * dataptr = PyArray_BYTES(pArray);
PyObject * p1 = PyArray_GETITEM(pArray, dataptr);
PyObject * p2 = PyArray_GETITEM(pArray, dataptr + stride);

I found this question because I had the same problem. 我发现了这个问题,因为我遇到了同样的问题。 Turns out the initial code was almost correct, just some more pointer magic required in the last line: 原来的代码几乎是正确的,最后一行只需要更多的指针魔术:

PyArrayObject * pArray = (PyArrayObject *) pArrayObj;
PyObject * p0 = *(PyObject **) PyArray_GETPTR1(pArray, 0);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM