静かなる名辞

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

Tips

【python】複数のlist(など)を対象にmapを使う

組み込みのmapは実は複数のiterableを引数に取れるように定義されています。 追加の iterable 引数が渡されたなら、 function はその数だけの引数を取らなければならず、全てのイテラブルから並行して取られた要素に適用されます。複数のイテラブルが与えら…

【python】__slots__は速度的にどうなのか

概要 __slots__を使うとメモリをケチれるという話はよく見かけますが、属性アクセスの速度については話を聞かないので調べてみました。 実験コード import timeit class A_slots: __slots__ = ["a"] def __init__(self): self.a = 42 class A_attr: def __in…

【python】辞書で複数の値を一つのキーにする

概要 複数の値を一つのキーにまとめて、結果と対応させたいというケースがあります。 >>> d = {1,2:"hoge", 3,4:"fuga"} # こんな感じ? 残念ながらこれはエラーになります。 File "<stdin>", line 1 d = {1,2:"hoge", 3,4:"fuga"} ^ SyntaxError: invalid syntax </stdin>…

【python】sklearn 0.20でclassification_reportの仕様が変わっていた

はじめに 遅まきながら、sklearn 0.20でclassification_reportの仕様が変わったことに気づきました。 基本的な使い方は変わりませんが、それなりに大きな変化になります。 変更点 まず0.19の引数と出力のフォーマット。 sklearn.metrics.classification_repo…

【python】print関数を使いこなそう

ぼくたちは本当のprintを知らない pythonのprint関数については、たかがprintと思っている人も多いと思いますが、しかしオプションをすべて言える人はあまりいないと思います。把握しておくと出力の細かい制御をしたいとき役立ちます。 そこで、printの使い…

【python】sklearnのRandomizedSearchCVを使ってみる

はじめに RandomizedSearchCVなるものがあるということを知ったので、使ってみます。うまく使うとグリッドサーチよりよい結果を生むかもしれないということです。sklearn.model_selection.RandomizedSearchCV — scikit-learn 0.20.3 documentation 比較実験 …

numpyやpandasでThe truth value of ... is ambiguous.のようなエラーが出たときの対処

概要 条件式を使って生成したようなboolのnumpy配列を使っていると、次のようなエラーが出ることがあります。 ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() また、pandasのSeriesやDataFrame…

ファイルオブジェクトのcloseはflushも行う。確実にしたければfsync

以前、「ファイルオブジェクトのcloseメソッドは同時にflushも行う」ことを知りました。 どうやらcloseするときは内部でflushメソッドが呼ばれるようです。 このストリームをフラッシュして閉じます。 io --- ストリームを扱うコアツール — Python 3.7.3rc1 …

scipy.optimize.curve_fitを使っていろいろな関数にフィットさせてみる

はじめに scipy.optimize.curve_fitを使うと曲線あてはめができます。いろいろな関数にフィッティングさせてみて、うまくいくかどうか試してみます。scipy.optimize.curve_fit — SciPy v1.2.1 Reference Guide f(x) = x + a ただの足し算。 import numpy as …

【python】numpyで任意の底でlog

任意の底でlogを計算したいときがあります。 結論から言うと、そういう関数は用意されていません。log, log10, log2はあるんですが。Mathematical functions — NumPy v1.16 Manual ほしければ、自分でlog(底)で割ってあげます。 >>> import numpy as np >>> …

【python】scipyで線形最小二乗法

概要 scipyのscipy.optimize.lsq_linearで最小二乗法が使えます。 使い方 最低限必要な引数は、 A いわゆる説明変数です。基本的には(データ数, 次元数)のshapeでいいのですが、バイアス項を入れたければすべて1にした列が要ります。 b いわゆる目的変数です…

【python】ジェネレータ式の使い所

概要 ジェネレータ式を使っているコードを見かける機会は少ないですが、ケースによっては有用なので使い所を紹介します。 この記事を読むと、漫然と使われたリスト内包表記に対して「ジェネレータ式の方が良くない?」と言えるようになったりします。 ジェネ…

【python】windowsではopenの引数にフォルダを指定するとPermissionErrorになる

最近はじめて知った仕様なのですが、windowsではタイトルの通りになります。 Linuxの場合。 $ mkdir hoge $ python >>> open("hoge") Traceback (most recent call last): File "<stdin>", line 1, in <module> IsADirectoryError: [Errno 21] Is a directory: 'hoge' 大変</module></stdin>…

【python】組み込み関数all・anyの引数はできるだけジェネレータ式などで書く

概要 組み込み関数all・anyはiterableの真理値すべてに対してand・orを計算します。 >>> all([True, True, False]) False >>> any([True, True, False]) True このall, anyは引数を短絡評価してくれます。ただし、条件式をリスト内包表記などで書くと台無し…

【python】numpyでバイナリサーチをするsearchsorted

numpy.searchsortedを使うとnumpyでソート済み配列に対するバイナリサーチ(二分探索)を行えます。numpy.searchsorted — NumPy v1.16 Manual ただし、1次元配列しか受け付けません。まあ、いいか。 次のように使えます。 >>> import numpy as np >>> a = np…

【python】np.randomの関数の配列サイズの渡し方をいつも忘れるのでメモった

np.random以下には色んな乱数生成関数があるのですが、毎回「生成される配列のサイズの指定方法がわからない、なんだっけ?」と思っているので、この際備忘録として残しておきます。Random sampling (numpy.random) — NumPy v1.16 Manual を見るとわかります…

【python】str.findとstr.indexの違い

はじめに str.findとstr.indexはどちらも文字列のメソッドで、引数に渡した文字列の位置を返します。 >>> "hoge".find("og") 1 >>> "hoge".index("og") 1 「一体なにが違うんだっけ」とふと思って調べてしまったので、メモします。 違い str.findは見つから…

【python】scipyのpdistとsquareformの使い方と仕組み

はじめに scipyで距離行列を扱うときはscipy.spatial.distanceのpdist, squareformなどを主に使いますが、長年よくわからないままに使っていたので、整理してまとめておきます。 なお、以下のドキュメントを参考にします。 scipy.spatial.distance.pdist — S…

【python】dictの集合演算を辞書ビューオブジェクトで行う

はじめに pythonのdictは便利なデータ型ですが、複数のdictに対して重複を除去する、逆に共通部分のみを抜き出すといった集合のような演算を行いたいときがあります。 dictそのものは集合演算をサポートしていませんが、辞書ビューオブジェクトというものを…

tkinterで遅い処理を別スレッドに投げ画面が固まらないようにする

tkinterでコールバック関数の実行に時間がかかる場合、実行している間ずっとGUIが固まります。そこで、別スレッドに実行を投げてこれを回避することができます。

【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…