読者です 読者をやめる 読者になる 読者になる

memoryfolder

メモです

ctypesでdllをラップする -続き

色々嵌ったのでメモ。

mallocして確保したメモリを引数に渡したい場合。

cdll.msvcrt.malloc.restype=c_long_p
buf  = cdll.msvcrt.malloc(c_int(length*sizeof(c_long)))

として

err = dll.GetNewData(buf,Size)

などとしてあげる

 

ctypesで読み込んだcの配列をnumpy arrayに変換する

ナイーブな実装として

array = [Clist[i] for i in xrange(size)]
2darray = np.reshape(array, (xsize,ysize))

があるけどすごい時間掛かるので、

What does asterisk * mean in Python? - Stack Overflow

How do I convert a Python list into a C array by using ctypes? - Stack Overflow

 

ここらへんを参考にしてみる

 

**もっといい方法見つけた

numpy.ndarray.ctypes — NumPy v1.11 Manual

numpy arrayのメソッドとしてctypes型として渡す方法がある。

このほうが断然早いしmallocなどしなくていい!

Using python for physics experiments

I personally don't like Labview so much..
Notes of the modules I am using.

pyvisa

control instruments

threading

multithread programming.

pygame

display manipulation

ctypes (read .dll files, c libraries)

numpy,matplotplib,

useful array manipulation and plotting

numexpr

fast numpy array element-wise calculations.

ctypesを使ってpythonからcのライブラリ(.dll)を読み込む

実験機器を操作するdllがあったので、それをpythonで使えるようにしたい。

ctypeを使います。

 

PY習 ctypesモジュール(1)

15.17. ctypes — A foreign function library for Python — Python 2.7.12 documentation

 

>>> from ctypes import *
>>> cdll.LoadLibrary("foo.dll")
>>> libc = CDLL("foo.dll")
>>> libc.function()

 

関数の引数と返り値の型を指定する必要があるみたいです。

.hファイルがあればそれを参照します。例えば以下のようにあったとします。

EXPNETTYPE unsigned int WINAPI Initialize(char * dir);

 

WINDEFなら、windows dllから読み込む必要もあるみたい。

>>> libc = windll.LoadLibrary("foo.dll")
>>> libc.funcion.argtypes = [c_char_p]
>>> libc.function.restype = c_uint
>>> path = "C:/mypath"
>>> ppath = c_char_p(path)
>>> libc.function(ppath)

とすればエラーなしに動いてくれました。

 

これでとりあえず関数を呼ぶことができた。まだ実験機器につなげて試してみてはないですが、これだけでpythonから使えるなら楽ですね。

 

メモ

 

ctypesを使う際の(個人的な)ポイント - Qiita

https://subversion.xor.aps.anl.gov/synApps/areaDetector/trunk/ADApp/andorSupport/ATMCD32D.h

c++ - Python using ctypes to pass a char * array and populate results - Stack Overflow

Pythonでctypesを使ってコールバック関数でchar*を返すには - Qiita

numpyを高速化するならまずnumexprを使ってみよう

 

光学系実験のためにnumpyを使って画像解析+色々な計算をしています。

どうしてもスピードがほしいとなったのでCythonを使って高速化してましたが、もっと手軽に試せる方法がありました。 

GitHub - pydata/numexpr: Fast numerical array expression evaluator for Python, NumPy, PyTables, pandas, bcolz and more

 

*, +, sin() などarrayのelement-wise operationをCの実装で高速化してくれるモジュールだそうです。

1000*1000の画像を扱う計算が多々あったので使ってみたところ、簡単に5倍程度になりました。forループなどが入っているならCythonにするべきかと思いますが、簡単に高速化を試したいなら使ってみてもいいと思います。

 

使用例は

>>> import numexpr as ne
>>> x = np.arange(1000)
>>> X,Y = np.meshgrid(x,x)
>>> Z = ne.evaluate("X**2+Y**2",local_dict={'X':X,'Y':Y}) 

sin, sinh, absなどの簡単な関数は入ってるし、部分的に最適化するのに向いてそうです

大学院留学のためにTOEFLを受けるかIELTSを受けるか

 

 

結論としては、出せるところはできるだけIELTSで出して、TOEFLしかダメなところはTOEFLにする

が良さそうだった。

 

最近受けた結果はTOEFL102,IELTS8.0でした。

 

1.点の取りやすさ

私の得点と変換表を見比べてもらえればわかりますが、IELTSの方がいい結果が出てたいます。

 

⑴IELTSは得点の解像度が低く、回ごとの誤差が吸収される。結果として実力を反映してくれる(ように思える)

TOEFLでは1,2問の差が点数に直接反映されますが、IELTSでは(overallだけ見れば)誤差の範囲でしかありません。そのため、たまたま少し悪い科目があっても大きく下がることがありません。

 

⑵これはよく言われますが、スピーキングが簡単というか、実力を発揮しやすい

TOEFLは英語力というか試験適応度が大きく物を言う気がする。しかも、だれも会話をリードしてくれないのできつい

 

⑶サチらない

変換表を見るとIELTSの方が上限が高いので、上の方ではちゃんと測れる。TOEFLだと満点に近いといかにミスを減らすかが重要になってくるので、別の技能の問題になってくる気がする

 

2.しかしIELTSを受け付けない大学院も多い

例えばstanford, uc berkeley(as an exceptionと書いてた)は受け付けてないのでまぁTOEFLは受けないわけには行かないみたい。

参考資料としてIELTSも出すのはありなんじゃないでしょうか。 

 

以上です

 

 

 

 

pythonでimportできるのにipythonでmodule not foundが出る問題

ipythonで、

import skimage

とすると

In [1]: import skimage
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
<ipython-input-1-dd3d86a55524> in <module>()
----> 1 import skimage

ImportError: No module named skimage

 

が出る問題(pythonでは問題ないのに)。

python - how to add directory to sys.path on ipython startup - Stack Overflow

 によると、ipython_config.pyに 

c.InteractiveShellApp.exec_lines = [
'import sys; sys.path.append("/usr/local/lib/python2.7/site-packages/")']

 などとすれば解決するらしい。

 

ちなみに、ipython_config.pyははじめからはないので、

ipython profile create

 とすれば生成してくれる。ipython_config.pyの場所はそのとき教えてくれる。

 

メモ:bash_profileについて

ユーザーの環境変数を設定するbashの設定ファイルと、カスタムプロンプトについて | OXY NOTES