与えられた配列の一部を取り出すには「スライシング」という仕組みを使います。ベクトル(1次元配列)「v」に対して、「v[i:j]」「v[i:]」「v[:j]」などとして一部の要素を抽出できるのはリスト型と同様です(In[22]:〜In[24]:)。また2次元配列については、「a[i:j,k:l]」のように、それぞれのインデックスでのスライシングができます(In[26]:〜In[29]:)。インデックスについて負の数は後ろから数えたインデックスを意味します。これもリスト型の扱いと同様です(In[25]:)。
In[26]:の、「reshape」というのは配列の形状を変更するためのメソッドです。このサンプルコードだと、「np.arange(9)」でサイズ9の1次元配列を作っているので、それを「reshape」で3×3の2次元配列に変更しています。
配列参照のカッコの中に、インデックスの列を表す配列を入れることで、複数の要素を一気に取り出すことができます。この操作のことを「インデクシング」と呼びます。
またインデクシングでは、インデックス列を表す配列以外にも、Bool型を要素に持つ配列を使うこともできます。この場合、参照される配列とカッコに入れられるBool型を要素に持つ配列は形状が同じである必要があり、Trueである部分の要素が取り出されます。
次に、配列を使った計算方法を幾つか紹介します。
和と平均値を求めるには「numpy.sum」「numpy.mean」を使います。これらは名前付き引数「axis」を指定することで、どの方向に計算するかを指定でき、「axis」の指定がない場合は全ての要素の和(平均値)を計算します。
また、「numpy.min」(最小値)、「numpy.max」(最大値)、「numpy.argmin」(最小値を取るインデックス値)、「numpy.argmax」(最大値を取るインテックス値)なども同じ使い方をします。
行列の掛け算は「numpy.dot」を使います。ここで2次元配列は行列と見なされ、1次元配列はベクトルと見なされます。1次元ベクトルが列ベクトルと見なされるか、行ベクトルと見なされるか、はnumpy.dotの呼び出し時に、都合が良いように自動で判断されます。
実はnumpyには2次元配列ではなく、行列を表す型「numpy.matrix」も存在しますが、2次元配列の方が高機能なため、行列型が使われることはほとんどありません。そのため、以降は、行列型を無視して進めていきます。
配列についての「*(アスタリスク)」演算子も存在しますが、それは行列の積を意味しないので注意が必要です。形状が同じ2つの配列について、四則演算子は要素ごとの計算を意味します。
今回の記事では、NumPyの配列の基本を説明しました。特にデータの詰め方、取り出し方、簡単な計算方法に注目して説明しました。次回は、配列を使った、さらに技巧的な計算手法と、SciPyの疎行列型の扱いについて説明します。
Copyright © ITmedia, Inc. All Rights Reserved.