仙豆のレシピ

ちょっとしたことでも書いていく姿勢で

numpy覚書

大したことしてないけど忘れたとき用に書いておく。

命名が微妙なのはまあ文脈によって変えるという感じで)

one_hot

def one_hot(v):
    return np.eye(v.shape[1], dtype=int)[np.argmax(v, axis=1)]

n個のd次元ベクトルに対し、それぞれのベクトルで最大の要素を1他を0にしたベクトルを返す。具体的には以下。

>>> 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()n \times n単位行列を生成、np.argmax()vの各ベクトルの最大値のインデックスを並べたn次元ベクトルを生成しそれを添え字とする。

count_class

def count_class(v):
    return np.sum(one_hot(v), axis=0)

n個のd次元ベクトルに対し、各インデックスごとにそのインデックスが最大値をとるベクトルの個数を現した配列を返す。

>>> 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)]

n個のd次元ベクトルに対し、最大値のインデックスが指定したいずれかの値とマッチしているベクトルのみを返す。

>>> 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"

Thinkpad X1 Carbon Gen6にUbuntu入れたらスリープ時にバッテリー食いまくる問題の対処、簡易版

Thinkpad X1 CarbonにUbuntuを入れて使っていて、先日マシンがGen1からGen6になった。ディスプレイが良くなってたりして満足度は高いが、スリープ時の消費電力がすさまじくスリープで充電が一晩持たないという問題が発生していた。

環境はThinkpad X1 Carbon Gen6にUbuntu 16.04(今回の問題は18.04でも発生するらしいけど、それはともかく早く検証して18に上げよう…)

続きを読む

zshで「!」をaliasしたい2

前に同じことをしようとして書いた .zshrc を少し改良した。
senz.hatenablog.com

前のやつだと

$ history
133 v
134 v
135 v
136 v

みたいになるし「↑」キーでも当然vしか戻らないので具合が悪かった。

よって以下に変更。

function v(){
    cmd=`fc -ln 1 | grep "^v." | tail -1 | sed -e "s|~|$HOME|"`
    print -S $cmd # add to history
    eval $cmd
}

zshaddhistory(){
    local line=${1%%$'\n'}
    local cmd=${line%% *}

    # if $cmd==v, don't add to history
    [[ ${cmd} != v ]]
}

ざっくり説明を書くと、

v()でvが入力されたときの挙動を指定。
まず前回と同様にhistoryのうちvから始まる最新のコマンドを取得し変数$cmdに代入。
print -S でhistoryに追加、その後実行。

zshaddhistory()はコマンドが実行されてからhistoryに書き込まれる前に実行され、
偽が返るとhistoryに書き込まないというものらしい。
よってコマンドがvのときは偽を返すように設定。

なんかもっとうまいことやる方法ないのだろうか

bibtexでコンパイルがうまくいかないとき(ubuntu14.04)

忘れそうだからメモ。

適当に日本語環境入れたubuntu14.04で

bibtex paper.aux

すると

ry)
I couldn't open style file jplain.bst
ry)

みたいに出たので、

d.hatena.ne.jp

を参考に、今回の環境だと以下を.bashrcに追記した。

export BSTINPUTS=$BSTINPUTS:/usr/share/texlive/texmf-dist/pbibtex/bst/

texについて何もわかってない

zshで「!」をaliasしたい

コマンドラインで作業してて、

$ vim very_very_long_name_file.py

みたいなのを何度も打つことになるとシンドイ。なので

$ !v

をよく使ってたけど、!を打つのすらめんどくさい気がしてきたのでもういっそ

$ v

だけで!vと同じ動作をしてほしくなった。

じゃあといってzshrcに以下を書いてみたところ、動かなかった。

alias v=!v

シェルのこととか何もわからないけど、見る人が見れば当たり前なんだろうと思う。

とりあえずこれを力ずくで実現するためにzshrcに以下を書いたのでメモ。

alias v='$(fc -ln 1 | grep "^v." | tail -1 | sed -e "s|~|$HOME|")'

もっとスマートな方法がある気がするので知りたい。

一度きっちり勉強しなきゃならんなぁという感じ。

簡単な解説↓

fc -ln 1 : コマンドヒストリーを表示

grep "^v." : vから始まって2文字以上のコマンド(.を入れないと二回目からvがヒットしてしまう)

tail -1 : 該当するうち一番新しいもの

sed -e "s|~|$HOME|" : ~があるとうまく動かなかったので置換。仕組みを理解していない

TensorFlowでjacobianを計算する

https://github.com/tensorflow/tensorflow/issues/675

で議論されていたけど実際の方法は載ってなかったのでメモ。
(まー見りゃわかるという話なんだろうけど初学者の自分はけっこう考えたので)

続きを読む

ubuntu上のpythonでechoの-eオプションを実行させられなかった

前のやつubuntuなマシンで動かそうと思ったら動かなくて原因探った。

前のやつというのはGUI無い環境でもターミナル内に画像を表示するよってやつで、-eオプションつけたechoをpythonから呼んでいた。

なんか画像表示されないなーと思ったら、スクリプトの最後の

    subprocess.call(code,shell=True)

の部分に問題があった。

どうやらsubprocess.call(code,shell=True)は

sh -c "code"

と同義らしく、確かにコマンドラインでsh -c "echo -e a\tb"みたいなことしてもうまくいかない。

結局ubuntuでは/bin/sh -> dash になってて、dashではechoの-eオプションが使えないのではないか、それが原因ではなかろうかと推測された。

というわけで該当部分を

    subprocess.call(code.split(' '))

に修正したら治った。

…この辺まったく知らないしなんとかしなきゃならんなあ