array クラス (ndarray と言うのか? N dimensional array から来ているそうだ) はいわゆる配列であるらしい。
array() は array 型のデータ (array クラスのインスタンスというのか?) を作れる。
array() の引数にリストを指定すると, そのリストの成分を持つ array が出来る。
>>> from numpy import * >>> array([1,2,3]) array([1, 2, 3]) >>> array(range(1,4)) array([1, 2, 3]) >>> array([[1,2,3],[2,3,4]]) array([[1, 2, 3], [2, 3, 4]]) |
あるいは
>>> import numpy as np >>> np.array([1,2,3]) >>> np.array(range(1,4)) >>> np.array([[1,2,3],[2,3,4]]) |
成分は a[ , ] でアクセス出来る。 C言語の配列のように 0 から始まることに注意する。
>>> a array([[1, 2], [3, 4]]) >>> a[1,1]=5 >>> a array([[1, 2], [3, 5]]) |
単なる代入 b=a は, 「参照による代入」であり, 別名がつくだけでコピーされるわけでなく, ソースを変更するとデスティネーションも変更される。 b を a のコピーにするには, 明示的に b=a.copy() とする。
>>> a=array([[1,2],[3,4]]) >>> b=a >>> a[0,0]=10 >>> a array([[10, 2], [ 3, 4]]) >>> b array([[10, 2], [ 3, 4]])b=a とした場合, a をいじったら,b も変わってしまいました。 >>> b=a.copy() >>> a[0,0]=1 >>> a array([[1, 2], [3, 4]]) >>> b array([[10, 2], [ 3, 4]])b=a.copy() とした場合, a をいじっても,b は変わらない。 |
array というクラスを用意したのは, もちろん実行効率上の理由も大きいだろう。
Mathematia のリストは, 行列やベクトルを表すのに使えるが, Python のリストでは全然無理 (スカラー倍すら出来ない)。 Python の array は,加法やスカラー倍は自然に出来る。
しかし掛け算 * は成分毎の積になる。 内積や行列としてのを計算するには dot() を用いるか (この辺は Mathematica のドット演算子 . を想起させる), 後で紹介する matrix にする必要がある。 array クラスは,次元が1,2より大きいものも使える, つまりベクトル・行列向けに特殊化せずに一般的である,ということだ。 この辺はなるほどと思う。
論よりラン |
>>> 2*[1,2,3] [1, 2, 3, 1, 2, 3] >>> 2*array([1,2,3]) array([2, 4, 6]) >>> array([1,2,3])+array([2,4,6]) array([3, 5, 7]) >>> array([1,2,3])*array([2,4,6]) array([2, 8, 18]) >>> dot(array([1,2,3]),array([2,4,6])) 28 |
reshape() でサイズを変更できる。
>>> a=array([1,2,3,4]) >>> reshape(a,(2,2)) array([[1, 2], [3, 4]]) >>> a.reshape(2,2) array([[1, 2], [3, 4]]) |
桂田 祐史