Anaconda 学習:NumPy 配列と ctypes 配列

2018-01-10 :  PCクリニック
前(2018-01-08)の記事「Anaconda2_x64 本格導入」で書いた如く、
常用マシンへの 64-Bit 版 Python2.7.14 の導入が完了した。

早速、学習を始めた。

先ずは、
バイナリデータファイルの読み込みについて


方式1(例) ファイル全体をNumPyアレイ(8バイトfloat配列)として読み込む:
“NumPy v1.13 Manual”のnumpy.fromfile
  Construct an array from data in a text or binary file.
で行けますね。
import  numpy  as  np
fp = open( 'hoge.dat', 'rb' )
npT = np.fromfile( fp, dtype=np.float64 )
# print len( npT ), npT[0]
といった感じ。


方式2(例) ファイル全体をctypes オブジェクトとして読み込む:
import  os
import ctypes as ct
C = ct.cdll.msvcrt
voidA = lambda x: ct.cast( x, ct.POINTER(ct.c_void_p) )
SZ = os.path.getsize( 'hoge.dat' )
fp = C.fopen( 'hoge.dat', 'rb' )
buf = ct.create_string_buffer(SZ)
sz = C.fread( buf, 1, SZ, fp )
ctT = ct.cast( buf, ct.POINTER(ct.c_double) )
# print ctT[0]
といった感じでしょうか?

ダメ。これは正しくない。
参照:“StackOverFlow”の「Using msvcrt in 64-bit python ctypes
  The default ctypes result type is a 32 bit integer
  but a file handle is pointer width, i.e. 64 bits.
  You are therefore losing half of the information in the file pointer.
つまり、
  デフォルトのctypes結果型は32ビット整数であるが、
  ファイルハンドルはポインタ幅、すなわち64ビットである。
  したがって、ファイルポインタの情報の半分が失われています。

と云うことで、
import  os
import ctypes as ct
C = ct.cdll.msvcrt
voidA = lambda x: ct.cast( x, ct.POINTER(ct.c_void_p) )
SZ = os.path.getsize( 'hoge.dat' )
C.fopen.restype = ct.c_void_p ##### この行が必要
fp = C.fopen( 'hoge.dat', 'rb' )
buf = ct.create_string_buffer(SZ)
sz = C.fread( buf, 1, SZ, voidA(fp) ) ##### voidA(fp) が必要
ctT = ct.cast( buf, ct.POINTER(ct.c_double) )
# print ctT[0]
といった感じで行ける。



ところで、

以上の2通りの方式に対して、
NumPy 配列と ctypes 配列との双方向の変換については?

・・・・・・・・・・

Python ドキュメントの、
numpy.ctypeslib」に載っていた。

numpy.ctypeslib.as_ctypes(obj)
  Create and return a ctypes object from a numpy array.
  Actually anything that exposes the
    __array_interface__ is accepted.
実例:
import ctypes as ct
import numpy as np
from numpy import ctypeslib as npct
doubleA = lambda x: ct.cast( x, ct.POINTER(ct.c_double) )
npT = np.array( [ 1, 2, 3 ] )
ctT = npct.as_ctypes( npT )
print( ctT[2] ) # ---> 3
これで、npT から ctT を作る。


numpy.ctypeslib.as_array(obj, shape=None)
  Create a numpy array from a ctypes array or a ctypes POINTER.
  The numpy array shares the memory with the ctypes object.
実例:
import ctypes as ct
from numpy import ctypeslib as npct
cInt5 = ct.c_int * 5
ctT = cInt5()
ctT[2] = 5
npT = npct.as_array( ctT )
print npT[2] # ---> 5
これで、ctT を npT と見なせれる。


本日はここまで。


Anaconda ( Python ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


171223,0106-08
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
04 | 2018/05 | 06
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク