静かなる名辞

pythonとプログラミングのこと



Tips

【python】クラスでデコレータ!

デコレータといえば関数で作るものだと思っている人も大勢いると思いますが、クラスでも__call__メソッドを実装すればクラスインスタンスはcallableになり、呼び出しできるので、デコレータたりえます。 通常のデコレータ並みに高機能なものが作れるのかどう…

【python】使いやすい関数の呼び出し回数カウンタを考える

関数の呼び出し回数を数えたい、というシチュエーションはたまにあります。その都度、場当たり的にカウンタ変数を増やしたりして対処するのも、まあ、ありといえばありですが、使いやすいものを作るとしたらどうなるかな? というのを興味本位で書いてみまし…

【python】ターミナル上でCUIでライフゲーム

概要 ANSIエスケープシーケンスを使って複数行を書き換えるテストとして書きました。洗練度は低いですがライフゲームが端末上で動きます。www.mm2d.net これを動かしておくことで、なんとなくかっこいい感じがします。 実装 基本的には以前作ったときと同じ…

【python】matplotlibのhistで棒の上にラベルを表示

plt.histはデータを与えるとそのままヒストグラムをプロットしてくれますが、棒との位置関係に基づいてテキストなどを表示させようとすると、ちょっと困ります。 しかし、plt.histの返り値を利用して棒の頂点の座標を取得すれば、そのままプロットすることが…

【python】自分自身を要素に持つlist・循環参照するlistなどを作ってみる

これまでやったことがなかったので、試してみたというだけです。データ構造によってはこういうのを作りたくなることもあるでしょう。 >>> lst = [0] >>> lst.append(lst) >>> lst [0, [...]] なるほど、こういう形で印字されるのか。特に問題はなさそう。 次…

multiprocessing.PoolでAttributeError: Can't get attribute '***' on <module '__main__' from '***.py'>みたいなエラー

概要 multiprocessing.Poolで並列化じゃ! と調子に乗ってコードを書いていると表題のようなエラーに遭遇することがあります。 再現するコード。poolerrortest.py from multiprocessing import Pool p = Pool(2) def f(x): print(x) p.map(f, [1,2]) # 中略 …

multiprocessing.Poolがやたらメモリを消費するときの対策

概要 multiprocessing.Poolは原理的にプロセスをforkさせるので、メインプロセスに大きなデータが残っているとそれが丸々コピーされてメモリ領域を食います。 グローバル関数限定ですが、initializerを使って必要ないデータを消すことができます。また、Pool…

複数のnumpy配列を同時にシリアライズできるnumpy.savezの使い方を解説

はじめに numpy.savezは最近使ってみてけっこう良い感じだったのですが、日本語のわかりやすい説明が少なかったので解説記事を書いてみます。 なお、以下のドキュメントも併せて参考にしてください。numpy.savez — NumPy v1.15 Manual 基本的な使い方 まず、…

numpy配列の直列化方法によるファイル容量の違いを比較

はじめに numpy配列を直列化する方法はいろいろあります。numpyから使える方法に限っても4つあります*1。numpy.savetxt — NumPy v1.15 Manual numpy.save — NumPy v1.15 Manual numpy.savez — NumPy v1.15 Manual numpy.savez_compressed — NumPy v1.15 Manu…

sklearnのfetch_20newsgroups_vectorizedでベクトル化された20 newsgroupsを試す

はじめに 20 newsgroupsはこのブログでも過去何回か取り上げまたしが、ベクトル化済みのデータを読み込めるfetch_20newsgroups_vectorizedは意図的にスルーしていました。 使えるかどうか気になったので、試してみます。sklearn.datasets.fetch_20newsgroups…

【python】fromでimportしたときの対象モジュールの実行の流れ

ふと「あれ、どうなってるんだっけ」と思うことがあったので実験してみる。import_test.py import time print("aaa") def hoge(): print("hoge") print("bbb") def fuga(): print("fuga") for i in range(1, 4): print(i) time.sleep(1) 普通に実行すると、 …

【python】numbaを使ってライフゲームを書いてみた

概要 ライフゲームを書きました。 素のpythonだと何をやっても激遅だったので、numbaで高速化しました。 方針 まず実装の方針を決めます。主要な関数としては以下のものがあればできると思いました。 update_cell 1セルの状態を更新する update_field フィー…

【python】rangeではin演算子が使える。速度は微妙かも

はじめに 今日コードを書いていて、rangeでもinが使えることに気づきました。 >>> 10 in range(20) True ドキュメントを見るとシーケンス型としての機能は一通り備えているようです。 range オブジェクトは collections.abc.Sequence ABC を実装し、包含判定…

【python】複数の条件を総なめするときの簡略化

たとえば、こういうものを書きたいとする。 def f(a, b): if a == "0" and b == "0": print("a:0, b:0") elif a == "0" and b == "1": print("a:0, b:1") elif a == "1" and b == "0": print("a:1, b:0") elif a == "1" and b == "1": print("a:1, b:1") 条…

ImportError: No module named 'sklearn.cross_validation'の対処

概要 sklearnで書籍やネットに掲載されているコードを実行した結果、表題のようなエラーが出ることがある。 一例をあげる。 >>> from sklearn.cross_validation import cross_val_score Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportErro</module></stdin>…

【python】sklearnでのカテゴリデータの取り扱いまとめ

カテゴリデータをone-hot表現として取り扱うという方法は、機械学習などでは一般的に行われます。しかし、sklearnでのサポートが微妙に悪いという問題が長年あり、やれpandasを使えだの、やれサードパーティ製ライブラリで凌げだのといった話題が乱立してい…

scipyで確率分布のサンプルと確率密度関数を生成する

乱数データと確率密度関数を一緒にplotしてみたかったので、メモ。 概要 scipy.statsでは様々な統計用のユーティリティが提供されています。大抵の分布はあるし、パラメータも好きに設定できます。Statistical functions (scipy.stats) — SciPy v0.16.1 Refe…

【python】sklearnのRFE(Recursive Feature Elimination)を使ってみる

はじめに RFE(Recursive Feature Elimination)というものがあることを知ったので試してみたいと思いました。 RFEは特徴選択の手法で、その名の通り再帰的にモデルを再構築しながら特徴を選択するという特色があります。sklearn.feature_selection.RFE — scik…

ループで辞書の要素を削除しようと思ったらRuntimeError: dictionary changed size during iteration

前提 ループで条件に従って辞書の全要素を舐め、条件が真になる要素を削除したい あくまでもin-placeで処理したい(今回はdel文で書いていた) 要するにこんなコード。 d = {v:"hoge!"*v for v in range(5)} # => {0: '', 1: 'hoge!', 2: 'hoge!hoge!', 3: '…

【python】numpy配列の結合方法まとめ

複数のnumpy配列を一つにまとめたいというシチュエーションはよくあると思います。numpyには配列を結合してまとめるための、様々な方法が存在します。この記事では8種類の方法と、それらの使い分けについて紹介します。

【python】ctypesのcreate_string_buffer()を使ってみる

はじめに 以前の記事で、ctypesでバイト列や文字列を受け渡しする方法について述べました。【python】ctypesでバイト列や文字列を受け渡しする - 静かなる名辞 しかし、ctypesに存在しているcreate_string_buffer()と create_unicode_buffer()には触れません…

【python】numpyで多次元配列のargsortと値の取り出し

はじめに numpy配列のargsort()メソッドは値をソートした結果のインデックスの配列を返します。 >>> import numpy as np >>> a = np.array([2,0,1,8,1,1,0,7]) # 適当な配列を定義 >>> idx = a.argsort() # argsort >>> idx # こんな配列になる array([1, 6,…

【python】引数のデフォルト値は定義時評価なので注意

はじめに pythonでは関数の引数にデフォルト値を設定することができます。 この機能を使うと、引数が与えられなかったときの挙動を定義することができ、とても便利です。 >>> def f(x="hoge"): ... print(x) ... >>> f("aiu") aiu >>> f(x="aiu") aiu >>> f(…

【python】ctypesでバイト列や文字列を受け渡しする

はじめに pythonではC言語の動的リンク/共有ライブラリを手軽に扱う方法として、ctypesという標準モジュールが用意されています。16.16. ctypes — Pythonのための外部関数ライブラリ — Python 3.6.5 ドキュメント ctypesを用いて自作したC言語の処理を呼び出…

pythonのスコープは静的に決まる。だから・・・

概要 少し疑問に思うことがあったので、書き留めておきます。 目次 概要 前提 確認したかったことと結果 まとめ 前提 まず以下のようなコードについて考えます。 >>> def f(): ... print(a) ... >>> a = "hoge" >>> f() hoge ここでf()の中のprint()でaを参…

【python】ctypesはmallocをfreeしてくれない

ctypesで呼びだす関数でmalloc()した場合、メモリリークが起きることと、その対策について

【python】呼び出し回数カウント関数を色々な方法で作る

はじめに 関数の呼び出し回数を数える、というのは割とよくあるサンプルプログラムです。 C言語で言うstaticなローカル変数を使うやつです。 #include <stdio.h> void f(void) { static int i = 0; i++; printf("%d\n", i); } int main(void) { f(); f(); f(); } /* r</stdio.h>…

【python】matplotlibで背景色と枠線の色を変える

はじめに matplotlibでは図(figure)の背景色と枠線(エッジ)の色を自由に設定できる。その方法についてメモしておく。 目次 はじめに 設定方法 plt.savefig()で反映されない まとめ 設定方法 plt.figure()の引数に渡してあげる。facecolorおよびedgecolor…

【python】matplotlibで図の余白を調整する

matplotlibで図を描画するとき、余白に納得がいかないことがある。 調整方法を自分用にメモ。 余白の大きさを変える plt.subplots_adjust()を使うと余白を調整できる。 ドキュメントによると、デフォルト値は以下の通り。 left = 0.125 # the left side of t…

【python】pythonで動的にメソッドを追加する

前置き この辺りの話、以前からちょっとモヤモヤしていたので、この際実験してすっきりさせておきます。 はじめに そもそも、pythonのメソッドは関数オブジェクト(もどき)のはずです。 ということは、クラス定義構文を使わなくても生成する手段があるはず…