静かなる名辞

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

2019/03/22:TechAcademyがteratailの質問・回答を盗用していた件
2019/03/26:TechAcademy盗用事件 公式発表と深まる疑念


numbaとnumpy.emptyでbool配列が作れないとき

タイトル通りのことをやろうとして、なんかエラーになったんですよね。 import numpy as np from numba import jit @jit("b1[:]()", nopython=True) def f(): a = np.empty(100, np.bool) return a f() 動きそうに見えますが、 Traceback (most recent call …

concurrent.futuresはなかなか便利かもしれない

概要 「いまさら?」と思われるかもしれませんが、concurrent.futuresを使う機会があり、けっこう幸せでした。 本当に「いまさら?」なのですが、どういうとき便利でどういう風に使えるのか書いておきます。 リファレンス concurrent.futures -- 並列タスク…

ThreadPoolExecutorのinitializerについて調べたのでメモ

概要 ThreadPoolExecutorにはinitializerという便利そうなオプションがあります。でもリファレンスの説明があっさりしていて、挙動がよくわからなかったので調べました。 先に断っておくと、このオプションはPython3.7で追加されたもので、それ以前のバージ…

Pythonで遅いサブプロセスをスレッド並列でたくさん叩く

概要 いつ使うんだと言われてしまうPythonのスレッドですが、Pythonの外で遅い原因があるときは高速化に威力を発揮します。 たとえばこんな感じです。言語はbashです。 #!/bin/bash sleep 3 echo "hoge" 特にひねりはありません。slow_command.shとでもして…

Pythonの文字列は同じ長さでもメモリ消費量が違うときがある

概要 Pythonの文字列は、内容によって一文字の幅が違います。 なお、Python3のstrを前提にさせてください。 実験 sys.getsizeofで測ってみます。これを使うのはちょっと議論の余地がありますが、 object のサイズをバイト数で返します。object は任意の型の…

Pythonの文字列メソッドとバイト列の微妙な関係

Python3になってからは普段あまり気にしなくても良いようになりましたが、Pythonの文字列っぽい型にはstrとbytesがあります*1。そして、strもbytesも同じようなメソッドを実装してくれています。組み込み型 — Python 3.8.2 ドキュメント組み込み型 — Python …

DataFrameをprintしたときヘッダの日本語の列名がずれないようにする

日本語の列名のDataFrameを扱うことは、日本人のpandasユーザにとってはありがちな展開だと思うのですが、問題はprintするとヘッダがずれてしまうことです。 >>> import pandas as pd >>> pd.DataFrame({"あああ":[1, 2], "いいい":[3, 4], "ううう":[5, 6],…

numbaとnumpyで速いループ処理を書くためのガイド(スレッド並列化のおまけつき)(実はポエム)

はじめに この記事は「Pythonおっせーよ」と思っている、そこのあなたのためのものです。 PythonはLLなので遅いです。その分、楽に書けるし、動的型付けでダイナミックなことができて「楽しぃぃいい」のですが、それでも遅くて困るときがあります。特に数値…

scikit-learnのStandardScalerで疎行列型のまま標準化する

ことのあらまし データの標準化は機械学習の前処理としてとても重要です。そして疎行列型データ構造は、スパースなデータを表現するためにはとても適しています。 残念ながら、普通に疎行列型を標準化しようとすると、疎行列性が失せます。考えてみればわか…

【python】zipを使ってn-gram列を生成する

はじめに n-gramは自然言語処理でよく使われる方法です。n-gram - Wikipedia さて、以下のような関数を作りたいとします。 n_gram("abcde", n=2, sep="-") # ["a-b", "b-c", "c-d", "d-e"] n=2ならbigram, n=3ならtrigramという言い方があります。さて、たと…

sklearnで混同行列をヒートマップにして描画するplot_confusion_matrix

はじめに scikit-learnのv0.22で、混同行列をプロットするための便利関数であるsklearn.metrics.plot_confusion_matrixが追加されました。 使いやすそうなので試してみます。 使い方 リファレンスはこちらです。sklearn.metrics.plot_confusion_matrix — sci…

pandasで年月日時刻の列を結合して一列にする(datetime64で)

概要 ローデータ(生データ)を取り込むと、年月日が独立して入っている感じの嫌なデータになっていることがあります。 年,月,日 1996,8,1 1998,12,2 2012,05,3 こういうのは嬉しくないので、できるだけ単一のdatetime風の型に変換しておきたいのですが、意…

【python】UnboundLocalErrorの原因と対処法

はじめに 関数の中で関数の外の変数を操作するようなコードを書いていると、たまに下記のようなエラーが出ます。UnboundLocalError: local variable '***' referenced before assignment 初歩的ですが、意外とまとまった良い解説がないので、記事にしておき…

scikit-learnで重み付きk近傍法(Weighted kNN)を試してみる

はじめに k近傍法には、近傍点の重み付けをどうするかで複数のやり方が考えられます。普通のk近傍点では予測対象の点のkつの近傍点を取ってきて、そのクラスを単純に多数決します。一方で、より近い点にはより大きい重みを持たせるという発想もまた自然です…

【python】キーワード引数と可変長キーワード引数(kwargs)の競合によるエラー

はじめに 既存の関数のwrapperを作るときなど、可変長キーワード引数を使いたいときがあります。 これは通常のキーワード引数と併用できますが、稀に問題になることがあります。 関数定義のとき 定義するときは割と単純で、問題も少ないです。 以下のような…