3.2.2 array

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]])
のようにも使える。 以下は from numpy import * とした場合で説明する。

$ (i,j)$ 成分は a[$ i$ ,$ j$ ] でアクセス出来る。 C言語の配列のように 0 から始まることに注意する。
>>> a=array([[1,2],[3,4]])
>>> a
array([[1, 2],
       [3, 4]])
>>> a[1,1]=5
>>> a
array([[1, 2],
       [3, 5]])

単なる代入 b=a は, 「参照による代入」であり, 別名がつくだけでコピーされるわけでなく, ソースを変更するとデスティネーションも変更される。 ba のコピーにするには, 明示的に 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 は,加法やスカラー倍は自然に出来る。

しかし 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]])

桂田 祐史
2018-01-07