Pythonでは、どのようにアクセスuint16[3]配列によってラップされたSWIG(unwrap、PySwigObject)?
質問
これはPythonの質問です。いての変数は、
>>> A
<Swig Object of type 'uint16_t *' at 0x8c66fa0>
>>> help(A)
class PySwigObject(object)
Swig object carries a C/C++ instance pointer
インスタンスで参照される配列の連続するuint16[3]その問題点へのアクセスと配列からエラーになります。
Pythonでは、作成方法を教えてください変数Bの長さは3を与えてくれるの読み取り/書き込みアクセスと同じメモリを指摘のポインタに包まれた。
と思うので問題は二つのパーツ:
- どのようにポインタのA.(いと思い0x8c66fa0ポイントをSwigのオブジェクトなのに包まれたオブジェクト
- どのようにinitialiseのPythonの配列を使用メモリのポインタと既知のデータ型になります。(ても済むはfrombuffer方法、もう必要はfrommemory法定額法を採用しております。 おそらくいくつかの鋳造が必要になります。
こんでしまいましたがって読みやハッキング以上!
解決の一環と思い例がこの方法:
>>> import numpy
>>> C = numpy.ascontiguousarray([5,6,7],"uint16")
>>> C
array([5, 6, 7], dtype=uint16)
>>> C.data
<read-write buffer for 0x8cd9340, size 6, offset 0 at 0x8902f00>
しようとしていB(あらゆるものをベクタータイプ)を使用"0x8902f00"と"uint16"および試験場合は変更にB[2]原因の変化C[2]となります。
このページをご提案または明確な例です。
について
オーウェン
解決
後より読みても、回答しており
1. The wrapped pointer in PySwigObject A is available as A.__long__() . 2. A raw pointer can be cast into an indexable type using ctypes as follows import ctypes pA = ctypes.cast( A.__long__(), ctypes.POINTER( ctypes.c_uint16 ) )
その後の要素をもって対応できてpA[0]、[1]など
pAポイントは同じメモリとして、元のオブジェクト、これを利用しないように注意してpA後に元のオブジェクトが削除されています。
ここでは、この問題を用いて原のポインタの既知のタイプPython)、
C = numpy.ascontiguousarray([5,6,7],"uint16") # make an array
C
rawPointer = C.ctypes.data
pC = ctypes.cast( rawPointer, ctypes.POINTER( ctypes.c_uint16 ))
pC[0:3]
pC[1]=100
pC[0:3]
C
の例はPythonすることがC[1]pC[1]に変更された100です。
解決しました。:)
所属していません StackOverflow