Python 如何使用numpy C API正确创建numpy字符串数组

Python 如何使用numpy C API正确创建numpy字符串数组,python,c,numpy,Python,C,Numpy,我试图在C扩展模块中创建一个字符串的numpy数组。我说不出我做错了什么,在这一点上我已经尝试了各种各样的事情。我的主要问题是,我正在创建一个固定大小的字符串类型数组,其中固定大小实际上是最大大小,但字符串是以null结尾的c字符串。 问题是,当我打印出我返回的数组时,它会打印整个固定长度,而不是空终止符,即: b'PZYJKT\x00A\x04'b'PZYJKBT\x00\x04'b'PZYJKBT\x00\x04' 而不是 b'PZYJKT'b'PZYJKBT'b'PZYJKBT' 我在本例

我试图在C扩展模块中创建一个字符串的numpy数组。我说不出我做错了什么,在这一点上我已经尝试了各种各样的事情。我的主要问题是,我正在创建一个固定大小的字符串类型数组,其中固定大小实际上是最大大小,但字符串是以null结尾的c字符串。 问题是,当我打印出我返回的数组时,它会打印整个固定长度,而不是空终止符,即:

b'PZYJKT\x00A\x04'b'PZYJKBT\x00\x04'b'PZYJKBT\x00\x04'

而不是

b'PZYJKT'b'PZYJKBT'b'PZYJKBT'

我在本例中设置了dtype=“S13”。如果我在本机python中执行相同的操作,那么一切都会正常工作:

>>> import numpy as np
>>> np.array( [ 'PZYJKT', 'PZYJKBT', 'PZYJKBT' ], dtype = 'S13' )
array([b'PZYJKT', b'PZYJKBT', b'PZYJKBT'], dtype='|S13')
即使在内部,它看起来就像我的字符串数组一样:

>>> _.tobytes()
b'PZYJKT\x00\x00\x00\x00\x00\x00\x00PZYJKBT\x00\x00\x00\x00\x00\x00PZYJKBT\x00\x00\x00\x00\x00\x00'
我唯一注意到的是,如果我将整个固定字符串初始化为零,那么它的工作方式似乎与python类似。可能是numpy查看最后一个空终止符的整个字符串吗

编辑:im用于创建阵列的代码:

template<size_t N>
PyObject * as_nparray( char * data )
{
    npy_intp dims[1]{ ( npy_intp ) buffer.size() };

    bp::str date_type = ( "S"s + std::to_string( N ) ).c_str();
    PyArray_Descr *descr;
    PyArray_DescrConverter( date_type.ptr(), &descr );
    return PyArray_NewFromDescr( &PyArray_Type, descr, 1, dims, NULL, data, NPY_ARRAY_OWNDATA, NULL );
}
模板
PyObject*作为数组(字符*数据)
{
npy_intp dims[1]{(npy_intp)buffer.size()};
str date_type=(“S”S+std::to_string(N)).c_str();
PyArray_Descr*Descr;
PyArray_DescrConverter(date_type.ptr(),&descr);
返回PyArray\u NewFromDescr(&PyArray\u Type,descr,1,dims,NULL,data,NPY\u ARRAY\u OWNDATA,NULL);
}
我还要补充一点,我发现这篇文章似乎暗示我怀疑numpy字符串应该是null填充的,而不是null终止的:

你能添加“最小化”代码,它在C扩展模块中创建字符串的麻木数组,并给你错误的结果吗?这看起来像C++代码,如果你用<代码> C++ +/Cuth>标签替换你的问题的<代码> C <代码>标签,那就更好了。然后您的问题将出现在正确的筛选器中。对不起,如果没有GrowingBuffer,就无法执行这些代码。你能给我一封信吗?