13

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 で処理し、結果を保存したいと思います。上記のようなコードでバッファを生成していますが、うまくいっているように見えますが、重要な問題を隠蔽したくありません。

4

2 に答える 2

13

Python のバグです。ctypesは現在、無効な PEP 3118 タイプ コードを生成しています。

このような矛盾が存在する場合、Numpy は PEP 3118 バッファー インターフェイスの使用をスキップし、古い (廃止された) バッファー インターフェイスにフォールバックします。これは正しく動作するはずです。

warningsPython のモジュールを使用して警告を消すことができます。ただし、警告はパフォーマンスに影響を与える可能性があります。

ctypes オブジェクトを でラップすることで、この問題を回避することもできますbuffer()

于 2011-02-11T11:53:15.750 に答える
5

これを行うには、警告を完全に回避するより便利な方法があります。

データを最初に ctypes 配列として作成してから NumPy 配列に変換する代わりに、すぐに NumPy 配列として作成しnumpy.ctypeslib.ndpointer、ctypes プロトタイプで型指定子として使用します。例として、引数としてaと afを取るC 関数が呼び出されたとします。char*size_t

void f(char* buf, size_t len);

あなたの ctypes プロトタイプは

from numpy.ctypeslib import ndpointer
some_dll = ctypes.CDLL(...)
some_dll.f.argtypes = [ndpointer(numpy.uint8, flags="C_CONTIGUOUS"),
                       ctypes.c_size_t]
some_dll.f.restype = None

そして、この関数を次のように呼び出すことができます

a = numpy.zeros(10, numpy.uint8)
f(a, a.size)
于 2011-02-11T12:02:55.953 に答える