tips:python:numpy:start
numpy
裏技
座標を得る
画像は高さ方向下向きにHで幅方向右向きにWと決まっている.
画像は(H,W,C)の形である.
コンピューターで使われる二次元座標はほとんどの場合右方向にX,下方向にYとなっている.
つまり画像中の座標は(Y,X)となっているのだ.
画像中の座標が求まると座標を利用した画像処理ができて便利.
(H,W,2_xy)の形の座標を作ってみよう.
H,W = Y,X = 5,7 grid = np.mgrid[:H,:W].transpose(1,2,0)[:,:,::-1] grid = np.mgrid[:Y,:X].transpose(1,2,0)[:,:,::-1] grid = np.stack(np.mgrid[:H,:W][::-1],-1) grid = np.mgrid[:H,:W][::-1].transpose(1,2,0) grid = np.mgrid[:W,:H].T
これをつかって画像中心からの距離を利用してグラデーションのかかった点を描画してみる
import numpy as np from PIL import Image H,W = 300,400 grid = np.c_[tuple(m[:,:,np.newaxis] for m in np.mgrid[:H,:W][::-1])] window = 3 x,y = grid[:,:,0], grid[:,:,1] x = x/W*window - (window/2) y = y/H*window - (window/2) v = np.e**(-(x**2+y**2))[:,:,np.newaxis] * 255 img = np.c_[v,v,v].astype(np.uint8) Image.fromarray(img)
この場合,2×2行列での座標変換は
transformed = (np.array([[1,2],[3,4]]) @ grid.reshape(-1,2).T).T.reshape(grid.shape)
とやるのが良さそう.
同次座標
(N,2)のndarrayを同次座標に変えて戻す
harr = np.c_[arr,np.ones((arr.shape[0],1))] arr = harr[:,:-1]
サンプリングを利用した画像変形
H,W,C = Y,X,_ = img.shape grid = np.mgrid[:H,:W].transpose(1,2,0)[:,:,::-1] smp_x = grid[:,:,0].astype(np.int64).flatten() smp_y = grid[:,:,1].astype(np.int64).flatten() out = img[smp_y,smp_x,:].reshape(H,W,C)
int から one hot へ
変形
np.r_はaxis=0でのconcatenate.
np.c_はaxis=-1でのconcatenate.(要検証)
dtypeは常に意識するのが良い.
in-place
numpyやpytorchのin-placeな関数とは 破壊的代入をおこなう関数.copy()などで防げる.
代入
以下は同じ,式が使えない内包表記ではメソッドが便利
canvas[A==B] = hoge canvas.place(A==B,hoge)
1チャンネル画像を3チャンネルにしたいときの書き方
# 持っている : alpha (H,W) # 欲しい : img (H,W,C) #通常 hoge = alpha[:,:,None] img = np.c_[hoge,hoge,hoge] #broadcast img = np.zeros((1,1,3),dtype=alpha.dtype)+alpha[...,None] #or img = np.array([[[0,0,0]]],dtype=alpha.dtype)+alpha[...,None] #内包 img = [np.c_[a,a,a] for a in [alpha[:,:,None]] ][-1] #method img = alpha[:,:,None].repeat(3,axis=2)
linalg
linear algebra (線形代数) パッケージ.
linalg.solve(A,B)
$AX=B$の$X$を返す.
型変換
.astype()でfloatからintへ変換すると,四捨五入ではなく小数点以下切り捨てとなる.
print関数の挙動を変更
numpy.set_printoptions() を使えば良い
tips/python/numpy/start.txt · 最終更新: 2021/11/28 17:13 by yuuho
