Category: Python

PyROOTを起動した時にno current threadというエラーがでる

問題 もうROOTを使うこともあまりないのですが、いざ必要になってPyROOTを起動しようとしたときに、「Fatal Python error: PyThreadState_Get: no current thread」とでて、 のようなエラーがでるとともに、「Python quit unexpectedly」というダイアログが出てPythonが終了してしまう問題が起きました。 原因 ROOTをインストールして以降、HomebrewでOS X付属のもの(/usr/bin/python)とは違うpythonをインストールした。 デフォルトで起動するpythonを、Homebrewで入れたものにしていた。つまり /usr/local/bin/python になっていた。 ROOTに付属しているPyROOTは、OS X付属のpython用にビルドされているので、ライブラリを読み込む時の不整合で上記のエラーが出る。 解決法 OS X付属のPythonを使う。/usr/bin/pythonからimportすると、以下のようにエラーがでない。 ROOTをソースコードから自分でビルドし直す。 暫定的に使えればいいのなら、方法1で問題なさそう。ずっと使うなら、ちゃんとバージョンを合せてビルドしなおすほうが良いですよね。

numpy.fftのテンプレート

matplotlibのテンプレートにつづいて、numpyでFFTするときのテンプレートです。1.5 MHzのsin関数を5.8MHz 4ビット分解能のADCで5000点サンプルしたときの結果です。np.fft.fftfreq()関数で周波数軸も求められるので、Hzで表示しています。 GistにはJupyter Notebookをそのままアップロードしておいたので、プロット結果、sin.textの中身とあわせて見ることができます。  

matplotlibのテンプレート(Rubyユーザ向け?)

仕事の都合でPython (numpyとmatplotlib)を使わないといけないのですが、numpyの関数スタイルとmatplotlibのオブジェクト指向がなかなかなじめなくて効率が悪いなーと思っています(毎回ウェブで書き方を調べないといけない)。matplotlib.plotの関数とaxesの関数で名前が違う(set_xlim()とxlim()とか)のがすごくややこしい。 とりあえず、軸ラベルの設定やスケール(lin/log)の変更など、やりたいことがすぐできるように自分用のメモ。以下のスクリプトを実行するか、Jupyter notebookにコピーペーストして実行すると、下のような図ができます。 RubyやROOTのオブジェクト指向に慣れている人は、以下の方法でfigとpanel (オフィシャルにはaxesと呼ばれている)を最初に作って、panelに対してplot()やset_xlim()をコールするほうが理解がスムーズだと思います。 FigureオブジェクトとAxes (プロット用のpanel)の生成 ソースコード全体: 1枚のプロットに複数のパネルをつくる例 gistからもダウンロードできます。  

Raspberry PiでI2C接続の128×64 OLEDに日本語を表示(美咲フォント)

先日のmbed nucleoでの128×64ピクセルOLEの駆動試験に続き、今年の冬の雷雲ガンマ線観測で使用するRaspberry Pi 3でも128×64ピクセルのOLED(Alibabaの販売サイト/Adafruitの販売サイト)をI2Cインタフェース経由で駆動してみました。画面そのものは小さいですが、16×2行のディスプレイよりも少ないインタフェース線数で、より多くの情報を表示することができます。みなさんも自分の電子工作で使ってみては。 【参考】雷雲プロジェクト – Thundercloud Project 概要 基本的にはAdafruitによるチュートリアル「SSD1306 OLED Displays with Raspberry Pi and BeagleBone Black」の手順通り。日本語フォントの読み込みと文字の表示のところだけ新規要素になります。 SSD1306というコントローラを搭載したディスプレイで使用できるAdafruitのPythonライブラリ(github)をつかうと、I2CもしくはSPIで接続したディスプレイに対して、テキストや図形の表示が簡単にできます。さらにTTF形式のフォントが読み込めてテキストごとにフォントを変更できるうえ、フォントサイズも簡単に指定できます。 美咲フォントのTTFファイルを読み込むことで、1文字8×8ピクセルの日本語(漢字も!)が表示できるようになります。ライブラリ製作元のAdafruitと美咲フォントの製作者の「門真 なむ」さんに感謝(懐かしいポケコンのプログラムなども公開されています)。 実行結果 以下のようになります。ちゃんと読めますよね!? 表示しているテキストは雷雲ガンマ線観測データを公開している「雷雲プロジェクト – Thundercloud Project」の冒頭部分(このディスプレイとは関係ないですが、thdr.infoでは皆さんも雷雲ガンマ線の観測データの解析に参加できるようになっています)。 最近の研究から、地球上のカミナリ雲でも電子が高いエネルギーにまで「加速」されている証拠が見つかってきました。加速された電子が大気分子と衝突することで生じるガンマ線がカミナリ雲からビーム状に放出されていることがわかったのです!…

Pythonのスプライン補間はscipyのInterpolatedUnivariateSpline

1000ノット以上のデータを補完しようとしてメモリ不足になる場合は、numpyのinterp1dではなく、scipy.interpolate.InterpolatedUnivariateSpline(x,y,k)を使いましょう。 たとえば という感じ。 「numpy スプライン補間」で検索すると、10点くらいのデータ点をサンプルに示して、interp1dを使えと書いてある記事が散見されます。これだと10万以上のノット数ではうまくいきません。Python 2系列でしか試せていないのですが、interp1dだと10万ノットで10GBを超えるようなメモリを確保しようとして、プログラムが応答しなくなります。InterpolatedUnivariateSplineだとすぐ完了します。日本語で検索しても同じ症状で困っている人がすぐに見つかりませんでしたが、英語だとStuckoverflowで「Cubic spline memory errorCubic spline memory error」という記事があって、InterpolatedUnivariateSplineを使え、と書かれています。 Pythonを使い始めました それにしても、RubyROOTやRubyFitsを使って、なるべくデータ解析もRubyで完結させるようにこだわってやってきましたが、会社ではPythonがスタンダードで、そうも言っていられなくなってきたので、いよいよPython (numpy/matplotlib)も使うことになりました。Jupyter便利ですね。 gistでJupyterのnotebookを共有しましょう 最近会社の人から教えてもらったのですが、gistでは2015年5月からJupyterのnotebookの見た目をたもったもったままレンダリングしてくれるようになっています(プロットもインラインで表示されます)。チームの人と解析結果を共有するのも簡単ですね。 [tmkm-amazon]4873116554[/tmkm-amazon]