はじめに
~配列の初期化をコンパクトにしたい~
その願い、実現できます。そう、3.8~ならね。
どうやるか
(変数名 := 定義)[スライス] = 変更
注) スライスしない場合も[:]
などとつけないとエラーを吐きます。
例えば
~対角線上に1~9が並んでる正方行列に、3行おきに1を足した行列を定義したい~
そんな謎のシチュエーションもこの通り
import numpy as np
(x:=np.diag(range(10)))[::3] += 1
x
out
array([[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 2, 0, 0, 0, 0, 0, 0, 0],
[ 1, 1, 1, 4, 1, 1, 1, 1, 1, 1],
[ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 5, 0, 0, 0, 0],
[ 1, 1, 1, 1, 1, 1, 7, 1, 1, 1],
[ 0, 0, 0, 0, 0, 0, 0, 7, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 8, 0],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 10]])
例えば
~対角線上に1~9が並んでる正方行列に、自身の左右を反転させた行列を引きたい~
そんな場合もこの通り
import numpy as np
(x:=np.diag(range(10)))[:] -= x[:, ::-1]
x
out
array([[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 1, 0, 0, 0, 0, 0, 0, -1, 0],
[ 0, 0, 2, 0, 0, 0, 0, -2, 0, 0],
[ 0, 0, 0, 3, 0, 0, -3, 0, 0, 0],
[ 0, 0, 0, 0, 4, -4, 0, 0, 0, 0],
[ 0, 0, 0, 0, -5, 5, 0, 0, 0, 0],
[ 0, 0, 0, -6, 0, 0, 6, 0, 0, 0],
[ 0, 0, -7, 0, 0, 0, 0, 7, 0, 0],
[ 0, -8, 0, 0, 0, 0, 0, 0, 8, 0],
[-9, 0, 0, 0, 0, 0, 0, 0, 0, 9]])
さいごに
何気に便利なセイウチ演算子活用シリーズが増えてゆく...