気ままに宙をみる

宇宙, 統計, 時々私事

numpyでconvolveしてみる

日本で一番簡単にビットコインが買える取引所 coincheck bitcoin

numpyを使って数値計算で畳み込みをしてみたのでメモしておきます。

numpyで畳み込みするにはnumpy.convolveという関数を使用します。
\[f(x) = x^2(0\le x \le 2)\]と幅2の長方形の畳み込みをしてみます。
f:id:cranethree:20150525023802p:plain:h400:w500

import numpy as np
import matplotlib.pyplot as plt
from math import *

x = np.arange(0,2.01,0.01) 
f = x**2  //f(x)の配列を作る
g = np.ones(200)/(len(np.ones(200))) //g(x)の配列を作る
con = np.convolve(f,g) //畳み込み
conx = np.arange(-1,3,0.01)
plt.plot(conx,con)
plt.show()

まずf(x)の配列を作ります。

x = np.arange(0,2.01,0.01) 
f = x**2  //f(x)の配列を作る

ここでは0~2まで0.01刻みの配列にしています。
次にg(x)の配列を作ります。

g = np.ones(200)/(len(np.ones(200))) //g(x)の配列を作る

np.convolve関数は配列同士を片方逆順にして、かけ算して足し合わせていくというもの(([1,2,3],[0,1,0.5])の配列をnp.convolveすると([1*0,2*0+1*1,3*0+2*1+1*0.5,1*3+2*0.5,3*0.5]) = ([0,1,2.5,4,1.5])という配列ができる)なので、畳み込みにするにはどちらかを規格化しておく必要があります。
ここではg(x)を規格化して配列の和が1になるようにしています。

con = np.convolve(f,g) //畳み込み
conx = np.arange(-1,3,0.01)
plt.plot(conx,con)
plt.show()

こうして作った配列をnp.convolveで畳み込みます。
np.convolve(f,g)の配列の長さはlen(f)+len(g)-1となります。また0≦x≦2のf(x)に幅2の長方形g(x)を畳み込むので出てくる関数は-1≦x≦3です。したがってそのような配列np.arange(-1,3,0.01)を作っています。これですべて材料が揃ったので後はプロットするだけです。

出てくるグラフは次のようになります。
f:id:cranethree:20150525022822p:plain

初めてのmatplotlib(2次関数のプロット)

日本で一番簡単にビットコインが買える取引所 coincheck bitcoin

pythonのグラフ作成にはmatplotlibというパッケージを利用することができます。
pythonのコードの中でグラフを作れるという点が非常に便利で、データ処理とグラフ作成を同じコード内で行うことができます。

グラフ描写にはgnuplotなんかも使えるのですがgnuplotを使う場合データ処理は別の言語で書いて、それをテキストファイルに出力して、gnuplotでそれを読み込んで描写させるという手順が必要です。matplotlibでは余計なファイルが無駄に増えないといった利点があります。またpythonのコードを使ってグラフが作れるのでpythonが使える人なら扱いやすいと思います。

早速matplotlibを使って簡単なグラフを描写してみましょう。
まずmatplotlib.pyplotとnumpyをインポートします。matplotlib.pyplotはグラフをプロットするのに必要なライブラリでpltと省略されることが多いです。またnumpyは数値計算ライブラリで行列計算したり、数値のリストを生成することができます。npと省略されることが多いです。どんなグラフを描くにしてもこの2つのライブラリはほぼ必須です。(matplotlib,numpyはインストールが必要です。インストールの仕方は他の記事を参考にしてください。)

さてmatplotlibを使って2次関数のグラフを描いてみましょう。

# -*- coding: utf-8 -*-
#y = x^2の2次関数のグラフを作成

import matplotlib.pyplot as plt  
import numpy as np 
x = np.arange(0,10,0.01) 
y = x**2
plt.plot(x,y) 
plt.show() 

f:id:cranethree:20150517162338p:plain

図のようなグラフが表示されるはずです。
コードの説明を少しすると、最初の2行でmatplotlib.pyplotとnumpyをインストールしています。
pythonではplt.plot()関数でグラフを描写できるのですが、そこに渡すのはリストである必要があります。
今回はx = np.arange(0,10,0.01)で0から10まで0.01刻みのリストを作っています。
x = [0,0.01,0.02,...,9.99]です。その後、このリストを2乗したリストを作ってyに入れています。y = [0,0.01,0.04,...,99.8001]です。
そしてこの2つのリストをplt.plot()に渡してグラフを作っています。

リストを作るならnumpyを使わなくてもpythonのrange()関数を使えばいいと思われるかもしれません。しかし、range()関数は1以下の刻みを作ることができないので曲線の描写には不向きです。
きちんとnumpyを使ってリストを作るようにしましょう。