配列の操作

目的

前回は,numpyモジュールの配列であるndarrayオブジェクトの作り方を学んだ.今回は,配列に対する簡単な処理について学ぶ.

説明

配列の表示

表示の省略

要素数が多い(デフォルトでは1000個を越える要素の)配列をprint関数で表示すると,表示が省略される.

例えば,1001個の要素をもつ配列をprint関数で表示すると,以下のようになり,全ての要素が表示されず,「…」と表示されることがわかる.

表示を省略しないようにするには,以下のようにすればよい.

6行目のように,numpyモジュールのset_printoptions関数でキーワード引数thresholdに整数値を設定すると,その数を越える要素数をもつ配列は省略表示される.ここでは,無限大(infinity)を表すnp.infを指定しているため,必ず表示が省略されないようにしている.

浮動小数点数の表示桁数

桁数の多い浮動小数点数からなる配列をprint関数で表示すると,デフォルトでは8桁まで表示される.

numpyモジュールのset_printoptions関数のキーワード引数precisionで表示する桁数を指定できる.

例えば,6行目のように記述すると,浮動小数点数を2桁まで表示するように変更できる.

配列のスライス

リストと同様に配列でもスライスを使用して,配列の一部のデータを取り出すことができる.

配列に使用できる算術演算子

配列の演算に使用できる算術演算子には以下のようなものがある.使い方や意味は数値データと同様である.

ブロードキャスト

ブロードキャストできない例

以下のような2つの配列を加算してみよう.

このプログラムを実行すると,以下のようなエラーメッセージが表示される.配列aは9個の要素からなる配列で,配列bは5個の要素からなる配列である.形(shape)が異なる配列は加算することができないため,このようなエラーが表示される.

ブロードキャストできる例

では,次のような場合はどうなるか確認しよう.

9個の要素をもつ配列に1を加算しているが,1は配列ではないため,これら2つのデータはshapeが異なる.numpyモジュールのndarrayオブジェクトでは,shapeが異なる場合でも,計算できる場合は計算してくれる.このような機能をブロードキャストという.

このプログラムを実行すると,以下のように表示され,shapeが異なるデータに対してブロードキャストが行われ,演算が実行されていることがわかる.

条件による配列の要素の抽出

配列の比較演算と条件による要素の抽出

条件を指定して,配列の要素の一部を抽出する方法を確認しよう.

8,9行目のように配列に対して比較演算を行うと,条件を満たす要素はTrue,満たさない要素はFalseとなる配列が返される.また,11,12行目のように記述すると,条件を満たす配列の要素のみを抽出することができる.

複数条件による配列の要素の抽出

複数の条件を指定して配列の要素を抽出するには,以下のようにすればよい.

複数条件を指定する場合には,論理積(かつ)のビット演算子である「&」や論理和(または)のビット演算子である「|」を使用すればよい.8行目のように記述すると,2つの条件をどちらも満たす要素はTrue,どちらかを満たさない要素はFalseとなる配列が返される.9行目のように記述すると,2つの条件のいずれかを満たす要素はTrue, どちらも満たさない要素はFalseとなる配列が返される.11,12行目のように記述すると,各条件を満たす配列の要素を抽出することができる.

複数条件指定時の注意

複数条件を指定するときには,記述の際に注意することがある.

複数条件を指定する際の正しい記述は8行目であり,10行目から13行目は全て正しくない記述である.ビット演算子「&」と比較演算子「<」や「>」では,ビット演算子の優先順位が高いため,10行目のように小括弧を記述しないとエラーとなる.また,「&」はビット演算子の論理積を表し,「and」は論理演算子の論理積を表す.numpyではビット演算により論理演算を行うため,11行目や12行目のように論理演算子を使用して記述するとエラーとなる.配列でない数値データの場合には,13行目のような記述が可能であったが,配列の場合には使用できないため,エラーとなる.

条件により配列に対する処理の内容を変える

条件により配列に対する処理の内容を変え,結果を配列として得るには,numpyモジュールのwhere関数を使用すればよい.

5行目で配列を作成し,6,7行目のように, numpyモジュールのwhere関数を,第1引数に条件,第2引数に条件を満たす場合の値,第3引数に条件を満たさない場合の値を指定して呼び出すと,条件で指定した配列と同じ形で,条件を満たす場合と満たさない場合の値を格納した配列を得ることができる.また,8行目のように,第2引数・第3引数には計算式等の処理を記述することができるため,条件に応じて処理内容を変えたい場合にも使用することができる.

上の例では1つの配列を使用したが,以下のように同じ形の配列であれば,第1引数・第2引数・第3引数にそれぞれ異なる配列を指定することもできる.

5行目から7行目までで同じ形の配列を作っている.8行目のように,配列aに対して条件を指定し,条件を満たす場合には配列bの値を,満たさない場合には配列cの値を格納した配列を作ることができる.

配列とリストの相互変換

配列とリストはPythonプログラムではよく使用される.そのため配列とリストを相互に変換する処理もよく行われる.ここでは配列とリストを相互に変換する方法を確認しよう.

リストから配列への変換

リストから配列に変換するには,以下のようにすればよい.

5行目で作成したリストから配列オブジェクトを生成するには,6行目のように記述すればよい.

配列からリストへの変換

配列からリストに変換するには,以下のようにすればよい.

5行目で作成した配列をリストに変換するには,配列オブジェクトのtolistメソッドを使用して6行目のように記述すればよい.

課題

課題0

2000個の要素をもつ配列を作成し,要素を省略せずに表示せよ.

課題1

10個の要素をもつ配列を作成し,要素を省略して表示せよ.

課題2

桁数の多い浮動小数点数からなる配列を作成し,要素の値を3桁で表示せよ.

課題3

0から99までの整数からなる配列を作成し,80以上の整数を取り出せ.

課題4

0から99までの整数からなる配列を作成し,2桁目が6の整数を取り出せ.

課題5

0から99までの整数からなる配列を作成し,2桁目が4の偶数を取り出せ.

課題6

0から99までの整数からなる配列を作成し,2桁目が7の奇数を値が大きいものから順に取り出せ.

課題7

形(shape)が同じ2つの配列を作成し,加算・減算・乗算・除算・整数の除算を行え.

課題8

形(shape)が異なる2つの配列を作成し,加算・減算・乗算・除算・整数の除算ができないことを確認せよ.

課題9

10個の要素を持つ配列を作成し,数値10との加算・減算・乗算・除算・整数の除算を行え.