静かなる名辞

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



Tips

【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では配列を結合してまとめる様々な方法が存在します。 色々あるのは嬉しいことですが、「多すぎて覚えきれんわ」と思ったので備忘録…

【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(); } /* re</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のメソッドは関数オブジェクト(もどき)のはずです。 ということは、クラス定義構文を使わなくても生成する手段があるはず…

【python】numpy配列の複雑な連結にはnp.blockが便利

numpy配列を連結したいとき、通常np.vstackやnp.hstack、np.concatenateなどを使うと思います。 しかし、これらでは一度で表せないような連結をしたいときがあります。たとえば、2次元配列を平面的に連結するような場合です。 >>> import numpy as np >>> a…

【python】missing 1 required positional argument: 'self'などの対処法

はじめに pythonに不慣れな方は、よくタイトルのようなエラーを見かけると思います。 実際には、このエラーはTypeErrorで、全体は以下のようなものです。 TypeError: メソッドの名前 missing 1 required positional argument: 'self' では、どうしてこのエラ…

【python】ImportError: No module named '***'の対処法

はじめに ライブラリをインストールして、いざ使おうと思ったら「ImportError: No module named '***'」が出ちゃった、という経験をされる方は多いと思います。 その対処法、トラブルシューティング手順についてまとめておきます。 なお、この記事はpipでイ…

【python】pandasのgroupbyで結果をlistにする

pandasのgroupbyを使って、平均や標準偏差を計算する方法は検索するとすぐ出てきます。 ただ、「そういうの良いから、項目ごとに使いやすいイテレータにしてまとめてくれよ!」と思うときがありますよね。 >>> import pandas as pd >>> df = pd.DataFrame({"…

【python】ネストされた辞書をflattenしてみる(一つの辞書にまとめる)

こんな辞書を考える。 d = {1:"a", 2:{"b":"hoge"}, 3:{"c":"fuga", "piyo":["foo", "bar"], "buzz":{"d":"hogehoge"}}} 次のような結果を得るにはどうすれば良いか。 {(1,): 'a', (2, 'b'): 'hoge', (3, 'c'): 'fuga', (3, 'piyo'): ['foo', 'bar'], (3, 'b…

【python】sysを使ってpythonインタプリタについて調べる

はじめに 実行しているpythonインタプリタはどこにあるの? という疑問が生まれたときは、標準モジュールのsysを使って調べることができます。 見るものの選択肢は幾つかあります。なお、この記事の内容はすべて公式ドキュメントに基づきます。29.1. sys — …

【python】numpy配列を分割する

はじめに numpy配列を分割したくなることがたまにある。 当然というかさすがというか、それ用の関数が用意されている。でも使い方をよく忘れるので覚書として書いておく。 目次 はじめに np.split np.array_split まとめ np.split そのまんますぎる名前の関…

【python】関数内関数は動的に生成される

わかっている人には当たり前のことですが、他の言語から来た人だと「んんん?」かもしれません。 こうなる >>> def f(): ... def g(): ... pass ... return g ... >>> a = f() >>> b = f() >>> a is b False >>> id(a) 139834257176640 >>> id(b) 1398342317…

【python】内包表記をbreakする方法を考える

リスト内包表記や辞書内包表記、ジェネレータ式などの内包表記は便利ですが、途中で止めたいときがあったとして(あるかどうかは知りませんが)どうしたら良いのでしょう? カウンタを使う こういう方法を真っ先に思いつきます。 >>> [x for x in range(20) …

【python】execを使って変数名を動的に変える方法についての考察

はじめに pythonでどうしても変数名を動的に変えたい場合、execを使うことになる。 実用的には無意味というかやるべきではないのだけど(他の方法でもっと合理的なコードが書ける)、やった場合の挙動でちょっと気になる点があったので、検証して記事にまと…

【python】ランダムフォレストのOOBエラーが役に立つか確認

はじめに RandomForestではOOBエラー(Out-of-bag error、OOB estimate、OOB誤り率)を見ることができます。交差検証と同様に汎化性能を見れます。 原理の説明とかは他に譲るのですが、これはちゃんと交差検証のように使えるのでしょうか? もちろん原理的に…

【python】多重リストを昇降混ぜてソート

pythonでは多重リストのソートは次のように書ける。 import random from pprint import pprint data = [[random.randint(0, 20), random.randint(0, 20)] for _ in range(10)] print("data") pprint(data) print("\nsorted data") pprint(sorted(data, key=l…

【python】io.StringIOは便利なので使いこなそう

はじめに io.StringIOというものがあります。標準モジュールのioに属します。io --- ストリームを扱うコアツール — Python 3.7.1 ドキュメント これがどう便利かというと、「ファイルオブジェクトのように見えるオブジェクト」を作れます。スポンサーリンク …

共有渡しと参照の値渡しと

はじめに 関数やメソッドに引数を渡す方法は、一般的には 値渡し 参照渡し の2通りがあると認知されている。 ところで、『参照の値渡し』という言葉も(ほぼ日本語Web圏限定で)存在する。これは「いわゆる『参照渡し』は参照自体を書き換えるんじゃなくて、…

【python】immutableなオブジェクトは1つしか存在しないという迷信

たまに誤解している人がいるので、書いておく。 pythonのオブジェクトにはimmutableという概念がある。これはオブジェクトが変更不可能であるということを示す。intやstr, tupleなどが代表的なimmutableなオブジェクトである。 オブジェクトがimmutableであ…

【python】GridSearchCV『の』パラメータ・チューニング

はじめに 機械学習でパラメータ・チューニングをしたい場合、グリッドサーチを行うのが定石とされています。sklearnではグリッドサーチはGridSearchCVで行うことができます。sklearn.model_selection.GridSearchCV — scikit-learn 0.20.0 documentation それ…

【python】sklearnのVarianceThresholdを試してみる

はじめに VarianceThresholdは名前の通り、分散がしきい値以下の特徴量を捨てます。sklearn.feature_selection.VarianceThreshold — scikit-learn 0.20.0 documentation これといってすごいところはありませんが、気楽に使えそうなので試してみました。 目次…