我有一个bool
的Numpy向量,我正在尝试使用C API来尽可能快地从中获取一个bytes
对象。(理想情况下,我希望将向量的二进制值映射到字节对象。)
我可以成功地读入向量,并且我有bool_vec_arr
格式的数据。我想创建一个int
,并以这种方式设置它的位:
PyBytesObject * pbo;
int byte = 0;
int i = 0;
while ( i < vec->dimensions[0] )
{
if ( bool_vec_arr[i] )
{
byte |= 1UL << i % 8;
}
i++;
if (i % 8 == 0)
{
/* do something here? */
byte = 0;
}
}
return PyBuildValue("S", pbo);
但是我不确定如何在pbo
中使用字节的值。有人有什么建议吗?
发布于 2019-04-27 00:43:56
你需要存储你刚刚完成的字节。您的问题是还没有创建一个实际的bytes
对象来填充,所以就这样做吧。您知道结果必须有多长(向上舍入,是布尔向量大小的八分之一),所以使用use PyBytes_FromStringAndSize
来获得一个大小正确的bytes
对象,然后按顺序填充它。
您只需使用以下命令进行分配:
// Preallocate enough bytes
PyBytesObject *pbo = PyBytes_FromStringAndSize(NULL, (vec->dimensions[0] + 7) / 8);
// Put check for NULL here
// Extract pointer to underlying buffer
char *bytebuffer = PyBytes_AsString(pbo);
其中添加7然后除以8向上舍入,以确保有足够的字节用于所有位,然后在完成一个字节时分配给适当的索引,例如:
if (i % 8 == 0)
{
bytebuffer[i / 8 - 1] = byte; // Store completed byte to next index
byte = 0;
}
如果最后一个字节可能不完整,你将需要决定如何处理这个问题(填充比特是出现在左边还是右边,最后一个字节是否被省略了,因此你不应该舍入分配,等等)。
https://stackoverflow.com/questions/55876270
复制