Polars の write_database() を INSERT OR IGNORE にする
polars.DataFrame.write_database で DataFrame を DB に書き込めるが、内部で実行されるのは INSERT
文なので既存テーブルに追加する際などにこれを INSERT OR IGNORE
にしたくなることがある。これを実現する方法をメモ。
Ubuntu22.04 環境構築メモ
自宅のメインマシンを10年ぶり(!)にリプレイスして ubuntu22.04 に CUDA 周り含めてセットアップしたので手順をメモ。
特に苦労がなくて驚いた。steam でゲームも問題なくできそう。
packages
必要パッケージインストール
sudo apt install git vim zsh tmux xsel python3.10-dev
CUDA, driver
# CUDA-Tool-Kit install (apt 経由) $ echo 'export PATH="/usr/local/cuda/bin:$PATH"' >> ~/.zshrc.local $ echo 'export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"' >> ~/.zshrc.local $ echo "blacklist nouveau \n options nouveau modeset=0" > /etc/modprobe.d/blacklist-nouveau.conf $ sudo update-initramfs -u $ sudo reboot # cudnn install (省略)
suspend すると CUDA が壊れる対処
画面描画等は問題ないが PyTorch から GPU が見えなくなったりするので対処する必要がある。 この方法 どおりにやればうまくいったっぽい。やはり Arch Wiki は神。 NVIDIA のドライバがデフォルトでは suspend 時に video memory の必要最小限しか保存しないのを全部保存するように設定する感じの模様。
$ sudo echo 'options nvidia NVreg_PreserveVideoMemoryAllocations=1 NVreg_TemporaryFilePath=/tmp' > /etc/modprobe.d/nvidia-power-management.conf $ sudo update-initramfs -u $ systemctl enable nvidia-suspend.service $ reboot
lock
なぜか lock ができなかったのでできるようにする: https://askubuntu.com/questions/1423645/screen-lock-not-working-in-ubuntu-22-04
mouse button
多ボタンマウスのボタンを設定する:参考
$ sudo apt install xdotool xbindkeys $ vim .xbindkeysrc
tmux の buffer を能動的にクリップボードに移す
tmux の buffer とクリップボードが連携してると便利だけど基本的にそれらは独立していてほしい(自動で buffer とクリップボードの中身が同じになってほしくない)ときの設定方法。
基本的に以下にあるようにすればよい: unix.stackexchange.com
自分の設定は以下:
# tmux buffer -> clipboard bind-key -T prefix C-c run "tmux save-buffer - | xsel --clipboard --input" # clipbard -> tmux buffer bind-key -T prefix C-v run "tmux set-buffer -- \"$(xsel --clipboard --output)\"; tmux paste-buffer"
(EDIT 2023/07/19: 特定の文字列(e.g., -V
) でうまく動かなかったので --
を追加)
こうすると prefix + C-c
で tmux の buffer がクリップボードに入り、 prefix + C-v
でクリップボードの値が tmux の buffer に入る。
そういえばこれ関係でいうと
https://twitter.com/senz1024/status/1529475979118546944
がいまだに解決できてないなあ
numpy覚書
大したことしてないけど忘れたとき用に書いておく。
(命名が微妙なのはまあ文脈によって変えるという感じで)
one_hot
def one_hot(v): return np.eye(v.shape[1], dtype=int)[np.argmax(v, axis=1)]
個の次元ベクトルに対し、それぞれのベクトルで最大の要素を他をにしたベクトルを返す。具体的には以下。
>>> v array([[0.1, 0.2, 0.7], [0.5, 0.3, 0.2], [0.3, 0.3, 0.4]]) >>> one_hot(v) array([[0, 0, 1], [1, 0, 0], [0, 0, 1]])
仕組みはnp.eye()
で単位行列を生成、np.argmax()
でv
の各ベクトルの最大値のインデックスを並べたn次元ベクトルを生成しそれを添え字とする。
count_class
def count_class(v): return np.sum(one_hot(v), axis=0)
個の次元ベクトルに対し、各インデックスごとにそのインデックスが最大値をとるベクトルの個数を現した配列を返す。
>>> v array([[0.1, 0.2, 0.7], [0.5, 0.3, 0.2], [0.3, 0.3, 0.4]]) >>> count_class(v) array([1, 0, 2])
one_hot()
してaxis=0で足すだけ。
select_classes
def select_classes(v, cls): return v[np.isin(np.argmax(v, axis=1), cls)]
個の次元ベクトルに対し、最大値のインデックスが指定したいずれかの値とマッチしているベクトルのみを返す。
>>> v array([[0.1, 0.2, 0.7], [0.5, 0.3, 0.2], [0.3, 0.3, 0.4]]) >>> select_classes(v, [0, 1]) array([[0.5, 0.3, 0.2]]) >>> select_classes(v, [1, 2]) array([[0.1, 0.2, 0.7], [0.3, 0.3, 0.4]])
np.isin()
でv
の最大値のインデックスがcls
に含まれているか否かの真偽値ベクトルを生成し添え字に利用。
ちなみにnp.isin()
はnumpyのversion 1.13.0 から入ったらしく、これが無いときは以下のようにしてた。
def select_classes(v, cls): ind = np.zeros(v.shape[0], dtype=bool) v_cls = np.argmax(v, axis=1) for c in cls: ind |= (v_cls == c) return v[ind]
おまけ
pythonのインタラクティブシェル便利だけど、毎回import numpy
するのめんどうなので以下のようにしておくとコマンドラインでnumpy
と打てばnumpyをインポートした状態でインタラクティブシェルを始められる。
$ echo "import numpy as np" > ${HOME}/.startup_numpy.py $ alias numpy="PYTHONSTARTUP=${HOME}/.startup_numpy.py python"