強弱と高低

Python3をメインに

Python3で素因数分解する

素因数分解をライブラリで行う

from sympy.ntheory import factorint

これが正体. 詳細は,

Number Theory — SymPy 1.0 documentation

動作例

In [1]: from sympy.ntheory import factorint

In [2]: factorint(100)
Out[2]: {2: 2, 5: 2}

はい簡単.

実行時間について

In [7]: %time factorint(131)
CPU times: user 55 µs, sys: 4 µs, total: 59 µs
Wall time: 65.8 µs
Out[7]: {131: 1}

適当にキーボードを叩いてみて.

In [8]: %time factorint(127128574306)
CPU times: user 581 µs, sys: 0 ns, total: 581 µs
Wall time: 565 µs
Out[8]: {2: 1, 63564287153: 1}

まだいける.

In [9]: %time factorint(475646893209485734869943817574386974835048976415)
CPU times: user 5min 4s, sys: 204 ms, total: 5min 4s
Wall time: 5min 4s
Out[9]: 
{5: 1,
 151: 1,
 479: 1,
 1024775561: 1,
 1555754843799829: 1,
 824958834555644183: 1}

時間かかる. もうやめておこう.

しっかりと素因数分解してくれるので使えるやつですね.

Kerasで学習したモデルを保存する OR モデルを再利用する

Keras @TF backendで構築したモデルを再利用したい

ドキュメントにすべて書いてありますので堅い字面でも読める人は以下参照のこと. FAQ - Keras Documentation

モデルの保存

(略)
model.fit((略))
model.save('AAAA.h5')

これでモデルがAAAA.h5という名前で保存された.引用すると,ここで保存されているのは

  • モデル構造
  • 学習したモデルの重み

である.モデル構造だけ, モデルの重みだけ保存したい場合の方法もあるのでそういうニッチな希望はドキュメントを参考にしてください.

モデルの読み出し

from keras.models import load_model
model = load_model('AAAA.h5')

これで読みだしている.ただしエラーが出てしまう人は,そもそもファイルが存在しないh5pyをインストールしていないに注意してください.

h5pyがないと, 先ほど保存したAAAA.h5ファイルが読み出せません. HDF5形式なので,やや特殊なファイル形式です. pip install h5pyでインストールしましょう.

読み出したモデルが本当に読み出せているか確認したい

そういうときは, model.summary()でモデルの構造を見ることができます. 出力を見て, 構築したものと同じであればOKです.

入れ子になったリストを作る方法

目的

入れ子になったリストを作る

group = [[], [], [], ...., []]

このようなリストで, 且つ任意の数だけ入れ子にさせる

方法

group = [[] for i in range(n)]

>> [[], [], [],..., []]

補足

入れ子はnestedとかネストした, とか呼ばれる. むしろ, 「入れ子のリストを作る」という言葉にたどり着かない可能性が高いですね.

インデキシングを狙って再掲, [[], [], [], ...]これ

ファイルのサイズを確認後, 空を削除する

流れ

  1. API等でファイルを取得
  2. ファイルサイズを取得
  3. 空なら削除

ファイルサイズを取得

os.path.getsize(path)

pathでファイル名も含めたPATHを与える

ファイルを削除する

os.remove(path)

ファイル名を含めたPATHを与える

sklearn.manifold.tsneのメモリリークを回避するために(Anacondaのみ)

現象

大規模データでscikit-learnのmanifold.tsneを使うとメモリエラーを起こします。Pythonでメモリエラーか。

原因

mklのバグ、、、らしい。以前にscikit-learnにイシューが立っていたようだ。バージョンが上がった現在でも改善はされていない。このイシューはPython2系時点だった。今回はPython3系なのでやはりバージョンも関係ない。

Python crashes when calculating large t-SNE · Issue #4619 · scikit-learn/scikit-learn · GitHub

対策(翻訳)

Anacondaのみだが conda install nomkl これで解決できる。これでintel-mkl ライブラリを使わないためメモリリークを起こさないようだ。

非Anacondaの場合はラッパーを利用することになる。

GitHub - danielfrg/tsne: A python wrapper for Barnes-Hut tsne

自分はAnacondaだったのでこっちは試していない。念の為。

pandasで要素内に特定の文字列が含まれる行を抜き出したい

列Aに"美"が含まれる行を抜き出す

index A ...
0 太郎 ...
1 真由美 ...
2 和則 ...
3 和美 ...
4 哲也 ...
5 ...

というDataFrame(df)があったとする。 このとき、"美"という文字列を含む行だけ欲しいという場合にどうするか。

str.containsを使う

df[df["A"].str.contains("美")]

これで

index A ...
1 真由美 ...
3 和美 ...

が返ってくる。 詳細はドキュメントで確認して欲しい。

pandas.Series.str.contains — pandas 0.19.1 documentation

pandasで条件にあった値を持つ行を削除する場合

列Aにあるnという値を持つ行を削除したい

df A B C
0 k n n
1 n n n
2 n k k
... ... ... ...
1000 n m m
... ... ... ...

この1行目2行目に該当する行を削除したい時にどうするか。
もちろんこの簡単な例ではdf.drop([1,2,1000])でいける? まさかそんな話ではない。

方針

  1. Aにnという値を持つ行を削除する
  2. Aにn以外の値を持つ行を抽出する

方針1

正直わからんかった。df.drop()はindexの値をリストとして与えればうまく削除できる。
ただ, df[df.A == n]で得られたDataFrameからindexのリストを取得することはどこを見ても書いてなかったしそもそもできないのかもしれない。

過去にindexの値を取得するスクリプトを書いた気がするがそれはまた別の機会に。

方針2

df[df.A != n]

これでよい。削除する削除するという頭だとどうしてもdf[df.A == n]をdropすることばかりに頭がいくが, 逆に考えてn以外の値を持つ行を抽出する。そう考える。