静かなる名辞

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

Tips

【python】operator.itemgetterを使うべきか否か問題

はじめに この記事を開いた人の大半は「itemgetter? なにそれ」という反応でしょう。 (いや、検索で来た人はそうでもないかもしれないけど) itemgetterは以下のように使えるものです。 >>> lst = list(zip([1,3,5,6,7,1,4], [3,4,1,0,8,5,2])) # 特に値に…

【python】np.meshgridの基本的な使い方まとめ

meshgridはなんとなく苦手な感じなので、操作をまとめておく。 目次 とりあえずmeshgirdを作ってみる 計算する plotしてみる x,y,z座標の配列に変換する まとめ 参考にしたサイト とりあえずmeshgirdを作ってみる meshgrid自体はこのように何の変哲もないも…

【python】sklearnで「何もしない」モデルがほしい

sklearnで「何もしない」モデルがあると、チョー便利。個人的にはそう思う。 どうやって使うかというと、具体的には前の記事で書いたFeatureUnionと組み合わせて使う。 参考:【python】複数の特徴をまとめるFeatureUnion - 静かなる名辞 たとえば、100次元…

【python】複数の特徴をまとめるFeatureUnion

単一の入力データから、複数の処理方法で幾つもの異なる特徴量が得られる・・・というシチュエーションがある。 この場合、「どれが最善か」という観点でどれか一つを選ぶこともできるけど、そうすると他の特徴量の情報は捨ててしまうことになる。総合的な性…

【python】1つおきにリスト・文字列などから抽出する

スライスの基本的な話なんだけど、意外と知らない人が多いと思うので。 1つおきに取り出すには、こうする。 >>> "hogehoge~"[::2] 'hghg~' スライスで指定できるのはstart, stop, stepであり、上のように指定するとstart, stopはNoneでstepが2になる。 参考…

【python】sliceのちょっと深イイ(かもしれない)話

リスト(じゃなくてもだけど)に次のようにアクセスするとき、内部的には__getitem__が呼ばれていることは、歴戦のpythonistaの皆さんには常識でしょう。 >>> lst = [1,2,3,4,5] >>> lst[0] 1 この様子を自作クラスで観察してみましょう。 >>> class Hoge: .…

【python】リストの各要素に違う処理をする

問題設定 想定しているのは、たとえばこんなシチュエーションです。 s = "hoge! 1234" tmp = s.split() lst = [tmp[0], int(tmp[1])] 要するに、比較的短いリストだが性質の違うものが入っており、それぞれ違う処理をして返したいのです。それだけなら良いの…

【python】calendarモジュールの使い方

calendarモジュールは標準ライブラリに入っていて、曜日や日付の計算にはけっこう便利なモジュールらしいです。 でもあまり周知されていないので、使い方を(自分用に)メモっておきます。 ドキュメントはここです。 8.2. calendar — 一般的なカレンダーに関…

【python】pandasでdfの平均と標準偏差を計算する方法

DataFrameから平均と標準偏差を計算する方法をメモしておきます。 目次 列の平均と標準偏差を計算したい 行の平均と標準偏差を計算したい 列の平均と標準偏差を計算したい 超簡単。 >>> import pandas as pd >>> df = pd.DataFrame([[1,2,3,4,5,6], [6,5,4,3…

【python】辞書で同じキーに複数の値を登録する

ちょっとしたTips。 辞書(dict)は通常、一つのキーには一つの値しか登録できない。代入しても上書きされる。 >>> d = {} >>> d["hoge"] = 1 >>> d {'hoge': 1} >>> d["hoge"] = 2 >>> d {'hoge': 2} こういうときどうすれば良いのかというと、値をリスト等…

【python】# coding: utf-8はもうやめる

pythonのプログラムは先頭行(あるいはシェバンの次の二行目)でファイルの文字コードを指定することができます。エンコーディング宣言といいます。 こんなのとか # coding: UTF-8 こういうのもありますね。これはemacsに自動認識させるための書式らしい*1。…

map・filterとリスト内包表記はどちらを使うべきか?

はじめに pythonにはmap・filterという関数と、リスト内包表記という独自の記法があります。どちらを使っても同じようなことができますが、どちらを使うべきなのでしょうか? 色々な視点から考えてみます。 目次 はじめに 返り値の型 冗長さ 可読性 事故 ま…

【python】mapで複数の引数を渡したいときはstarmapが便利

pythonにはmapという関数があります。しかし、これはデフォルトでは一つの引数を前提としています。 >>> list(map(lambda a,b: a+b, zip([1,2,3],[4,5,6]))) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: <lambda>() missing 1 required pos</lambda></module></stdin>…

【python】numpyで二次元配列を結合して三次元配列にする方法

複数の二次元配列を結合して三次元配列に変換する方法について。 np.dstack そのものずばりのnp.dstackという関数がある。numpy.dstack — NumPy v1.14 Manual >>> a = np.array([[1,2,3],[4,5,6]]) >>> b = np.array([[7,8,9],[10,11,12]]) >>> a array([[1,…

【python】順列・組み合わせを計算する方法

順列(Permutation)と組み合わせ(Combination)がほしくなるときがある。 だいたい標準モジュールかライブラリでできるので、計算方法についてまとめておく。 目次 順列・組み合わせそのものがほしい場合 順列の場合 組み合わせの場合 順列・組み合わせの…

【python】sklearnのtolってなんだ?

公式ドキュメントをよく読む方なら、色々なモジュールに"tol"というオプションがあることに気づいていると思います。たとえばSVCだと、こんな風に書いてあります。他のモジュールも似たり寄ったりですが。 tol : float, optional (default=1e-3)Tolerance fo…

【python】行を上書きしてprintする方法

出力の行を上書きしたいときがある。キャリッジリターン(\r)を使うと簡単にできるが、ちょっと難しい点もある。 方法 簡単な例を以下のサンプルコードに示す。 import time def main(): for i in range(20): print("\r{0:d}".format(i), end="") time.slee…

【python】pythonでscanf的なことをする

一年以上前にこんな記事を書きました。これはこれで今読み返すと面白い(香ばしい)記事ですが、真剣にpythonでscanfと同じことをしたくてアクセスしてきた人には役に立たないという問題点がありました。 そこで、pythonでscanfと同じことをする方法について…

【python】pythonでprintf的なことをする

一年以上前にこんな記事を書きました。これはこれで今読み返すと面白い(香ばしい)記事ですが、真剣にpythonでprintfと同じことをしたくてアクセスしてきた人には役に立たないという問題点がありました。 そこで、pythonでprintf的なことをする方法をまとめ…

【python】sklearnライクなデータセットを作る

自作したりネットから拾ってきたデータセットにsklearnライクなインターフェースがあるとそこそこ便利です。なので、作る方法について調べました。 とりあえずデータセットを読み込んで型を調べます。 >>> from sklearn.datasets import load_iris >>> iris …

【python】SOMのライブラリSomocluはかなりおすすめ

SOM(Self-organizing maps:自己組織化写像)は割と古い、データの可視化手法(それ以外にも使えるが・・・)です。今回はpythonのSOMライブラリSomocluを使ってみたら、けっこう良かったというネタです。 目次 SOMの概要 ライブラリがない それでも頑張って…

【python】クラス変数のスコープには注意が必要

pythonでクラスを書くとき、一番多用するのは(恐らく)インスタンス変数ですが、クラス変数もたまに使います。 しかし、pythonのクラス変数にはちょっと「クセ」があります。リスト内包表記と組み合わせて問題になることが多いようです。 問題の例 リスト内…

【python】三項演算子のネストには注意

三項演算子(条件演算子)はpythonの文法でもっとも特徴的な要素かもしれません。 Trueのとき if 条件 else Falseのとき これには賛否両論がありますが、とにかく便利なことには違いありません。ただし、ネストして使うときは注意が必要です。 A if conditio…

【python】数字を1桁ずつに分解

こういう処理がしたいときがある。 i = 2049 lst = [] while i > 0: lst.append(i%10) i //= 10 # 必須 lst.reverse() print(lst) # 結果-> [2, 0, 4, 9] 「もうできたじゃん」という意見もあると思うが、C言語のコードみたいでいかにもpythonicじゃない。 …

【python】in演算子は遅いのか?

記事の概要 素朴な疑問:「in演算子は遅いのか?」 速度を実測して検証しました。 目次 記事の概要 はじめに 検証 結果 結論 はじめに inの速度は謎である。とりあえず、なんとなく速くはないイメージはあるといえばあるので、ループの中でinを書くとちょっ…

【python】複数の選択肢から確率で選ぶ

強化学習のプログラムや、おみくじ、福引きのようなものの実装などでタイトルのような「複数のものから確率で選ぶ」処理が必要になることがある。 これについては以前にもこのような記事を書いた。【python】一定の確率で違う選択をする - 静かなる名辞 この…

【python】改行せずに代入文と等価のことをする

pythonワンライナーを書く上で障害になるのは、代入文の存在である。代入は関数ではなく文なので、素直に書くと一行を消費してしまうし、lambdaやコレクション型の中にも入れられない。 よく知られた対策としては、変数辞書を直接書き換えるという大技がある…

【python】defaultdictは使い方をミスると重くて遅い

defaultdictはpythonで使えるとても便利なコレクション型です。しかし、使い方には注意が必要な場合があります。 目次 defaultdictの概要 問題点 解決策 まとめ defaultdictの概要 これはご存じない方向けの章なので、「知ってるよ」という方は読み飛ばして…

【python】collections.ChainMapの使い方を理解する

conclusion 記事本文でだらだらと説明していますが、要約すると、 複数の辞書を一つにまとめる方法 元辞書への参照を張ってごにょごにょするだけなので、新しい辞書を作るより(ケースバイケースだが)速い 当然元辞書を変更すると反映されてしまう これだけ…

【python】外部プロセスと標準入出力で通信する

pythonで外部プロセス(subprocess)と、標準入出力を介したやりとりをしたいときがある。 目次 やってみること 簡単な方法 とりあえずやる 解説 応用:複数回入出力を送りつけたい まとめ やってみること 今回は問題例として、形態素解析器MeCabをpythonか…