Pythonでスペクトルや画像などの多数の数値を扱う方法には、ListとArrayがあります。
ListはPythonが初めから備えている型なので、Python関連のテキストで一般的に紹介されています。
x=[0,1,2,3,4,5,6,7,8,9,10]
y=[0,1,4,9,16,25,36,49,64,81,100]
plt.plot(x,y,'ko')
[<matplotlib.lines.Line2D at 0x2ff8810>]
type(x)
list
type(y)
list
リストに含まれる数値を計算するのは少しだけ面倒で、かつ計算速度も遅いです。
z=[_y*2 for _y in y]
C言語の様にfor文を使う方法もありますが、こちらの方がシンプルに書けるのでおすすめします。 このような表記はリスト内包表記と呼ばれています。同じ事をfor文で書くと、
z=[]
for _y in y:
z.append(_y*2)
となります。インデントは意味があるので、気をつけましょう。
plt.plot(x,y,'ko')
plt.plot(x,z,'ro')
[<matplotlib.lines.Line2D at 0x6145710>]
ndrrayはnumpyで定義されているので、正確にはnumpy.ndarrayと呼ぶ。 典型的には、np.loadtxtで読み込まれた数値データはnumpy.ndarray
意味は任意の次元の配列という意味だと思います。(n-dimensional array)
data=np.loadtxt('DammyData.txt',delimiter=',')
type(data)
numpy.ndarray
np.ndarray.shape
<attribute 'shape' of 'numpy.ndarray' objects>
numpy.ndarrayはshapeという属性をもっているので、これでサイズや次元を知ることができます。
data.shape
(1000, 2)
datax=data[:,0]
datay=data[:,1]
このように、[]の中に数字を書いてコンマで区切る事で配列の要素を指定できます。コロン「:」は全てという意味です。 2次元配列なので、行列と思うとするなら、最初の列(0列目)をdatax、次の列(1列目)をdatayという変数に代入しました。
plt.plot(datax,datay,'black')
plt.plot(datax,datay*2,'red')
[<matplotlib.lines.Line2D at 0x4e6da90>]
numpy.ndarrayはnumpyの機能によってそのまま演算できます。 データ解析のための計算はこの機能を活用する事によって快適に、かつ高速に実現します。 しかし、listを併用する場面も頻繁にでてきます。
x1=np.linspace(0,100)
y1=np.sin(x1/4.)+2
x2=np.linspace(0,50)
y2=np.cos(x2/5.)+3
plt.plot(x1,y1,'black')
plt.plot(x2,y2,'red')
[<matplotlib.lines.Line2D at 0x61ed350>]
たとえば、上記のような二つのスペクトルがあり、ベースラインを引いて対数をとる場合を考えましょう。 最初のy1のベースラインを1.0、y2のベースラインを2.0とすると、
baseline=[1.0,2.0]
ylist=[y1,y2]
ylistnew=[ np.log10(_y-_baseline) for (_y, _baseline) in zip(ylist, baseline)]
plt.plot(x1,ylistnew[0])
plt.plot(x2,ylistnew[1])
[<matplotlib.lines.Line2D at 0x6295470>]
zipは二つのリストをまとめて扱うのに便利な関数です。以下の様にlist()に入れると働きが分かりやすいでしょう。
list(zip(x, y))
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49), (8, 64), (9, 81), (10, 100)]
listをつけて上のセルを書き直しても同じ結果が得られますが、つけない方が大きなデータを扱う際にメモリを消費しなくて良いようです。
baseline=[1.0,2.0]
ylist=[y1,y2]
ylistnew=[ np.log10(_y-_baseline) for (_y, _baseline) in list(zip(ylist, baseline))]
plt.plot(x1,ylistnew[0])
plt.plot(x2,ylistnew[1])
[<matplotlib.lines.Line2D at 0x62ed870>]
実は私自身はもう少し汚いソースを書く癖があるのですが、ここでは示さない事にします。
終わり。