使用ctypes数组作为numpy数组时出现PEP 3118警告

2024-10-01 11:42:02 发布

您现在位置:Python中文网/ 问答频道 /正文

当我尝试将ctypes数组用作numpy数组时,收到以下警告消息:

Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import ctypes, numpy
>>> TenByteBuffer = ctypes.c_ubyte * 10
>>> a = TenByteBuffer()
>>> b = numpy.ctypeslib.as_array(a)
C:\Python27\lib\site-packages\numpy\ctypeslib.py:402: RuntimeWarning: Item size
computed from the PEP 3118 buffer format string does not match the actual item s
ize.
  return array(obj, copy=False)
>>> b
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=uint8)

不过,这个代码似乎正在工作。忽视这个警告是不是个坏主意?在

背景: 我调用一个实时生成数据的C DLL。我需要传递DLL一系列的缓冲区来保存数据。在等待下一个缓冲区填充时,我想用numpy处理最近的缓冲区并保存结果。我用上面的代码生成缓冲区,事情似乎都在工作,但我不想掩盖一个重要的问题。在


Tags: the数据numpy消息警告数组ctypesarray
2条回答

这是Python中的一个bug。ctypes当前生成无效的PEP 3118类型代码,Numpy注意到: http://bugs.python.org/issue10746http://bugs.python.org/issue10744

当出现这种不一致时,Numpy将跳过使用pep3118缓冲区接口,并返回到旧的(过时的)缓冲区接口。这应该能正常工作。在

您可以使用Python的warnings模块使警告静音。但是,警告可能会影响性能。在

您也可以尝试通过将ctypes对象包装在buffer()中来解决这个问题。在

有一种更方便的方法可以完全避免警告:

不要先将数据创建为ctypes数组,然后将其转换为NumPy数组,只需立即将其创建为NumPy数组,然后在ctypes原型中使用numpy.ctypeslib.ndpointer作为类型说明符。例如,假设您有一个名为f的C函数,它以char*size_t作为参数:

void f(char* buf, size_t len);

你的ctypes原型应该是

^{pr2}$

你可以把这个函数称为

a = numpy.zeros(10, numpy.uint8)
f(a, a.size)

相关问题 更多 >