NumPyとは数値計算に特化したPythonのライブラリです。NumPyは科学や工学分野をはじめ広い分野で利用されているのも特徴です。
そのため、PythonでコーディングをするにあたってNumPyは避けて通れないといえます。そこで今回はNumPy初心者、ひいてはPython初心者の方に向けてNumPyの基本的な操作について紹介、解説していこうと思います。
NumPyとはNumerical Pythonの略称?で要はPythonで数を扱うためのライブラリということです。NumPyのAPIは他のPythonライブラリにも広く使われており、Pandas(表計算ライブラリ)やMatplotlib(グラフ描画ライブラリ)、scikit-learn(機械学習ライブラリ)などにも使用されています。
Numpyでは1次元の様々な計算のための関数はもちろん、2次元以上のデータ処理にも対応しています。
前置きはこの辺に、早速NumPyを使っていきましょう!
※Python環境は構築済みの想定です。まだの方は以下記事を参考に環境構築してみてください^^
↓↓普通のPython
↓↓Anaconda(データサイエンスとか計算用途でPythonを使う場合はこちらがオススメ)
インストール
まずは手元のPython環境にNumPyをインストールしましょう。普通にPythonを入れた場合はpipを使ってインストールします。コマンドプロンプトで以下のコマンドを実行します。
pip install numpy
pipのパス(環境変数)が通っていない(pipなんてコマンドはないと怒られた)場合は、以下のようにします。
python -m pip install numpy
※Pythonのパスが通っている前提です。
AnacondaでPython環境を構築した場合はデフォルトでNumPyがインストールされているはずです。Anaconda Promptでconda listというコマンドを実行して、インストール済みのパッケージ一覧からNumPyがインストールされていることを確認してください。
仮にインストールされていない場合は、以下のコマンドでインストールできます。
conda install numpy
これでNumPyが使えるようになりました!早速試してみましょう。今回筆者はAnacondaのJupyter Notebookでコード書いていきます。
NumPyのインポート
プログラムでインストールしたライブラリを使用するためには、プログラムの中でインポートする必要があります。NumPyをインポートします。一般的に、NumPyはnpという名称でインポートされる場合が多いです。
import numpy as np
この1行をコードの冒頭に記述すれば、以降はnpとしてNumPyを呼び出すことができます。
配列
配列はNumPyの中でも重要なデータ構造です。NumPy配列を扱えるようになれば、NumPyを使いこなせると胸を張っても問題ないでしょう。
配列とは要素が並んだものです。NumPyでは、数が並んだものを配列と呼びます。以下にNumPy配列の例を示します。
#1次元の配列
list_1D = np.array([1,2,3,4,5,6])
#2次元の配列
list_2D = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
NumPyで配列を作る方法の1つとして、np.array()に配列を渡すやり方があります(他も後述)。
list_1Dは1次元の配列です。表でいうところの1行に相当します。
list_2Dは2次元の配列です。よく見ると、配列が入れ子になっていることがわかります。横に配列が並んでいるのでわかりにくいですが、2次元配列は表のような行列のデータ構造をしています。
わかりやすいように並び替えてみます。
こうすると表みたいな構造であることが一目瞭然です。また、入れ子を重ねることで3次元以上の高次元配列も作成することができます(わかりやすく可視化はできませんが…)
ちなみになんでNumPyの配列を使うの?Pythonの配列じゃダメなの?と思うかもしれません。NumPy配列は、Pythonの配列よりもメモリ使用量が少なく、処理速度が速い点が特徴です。
これは、Python配列はデータ型(文字列とか数値とかboolとか)に関係なく値をぶちこめるのに対し、NumPy配列には数値しか入れられないことが関係しています。
要素へのアクセス
配列を操作するにあたって、それぞれの要素にアクセスする機会は少なくありません。例えば配列の〇番目の値を取得するとか、配列の〇番目の値を書き換えるといった場合です。
配列は基本的に先頭から何番目という形で指定します。注意しないといけないのは、先頭は0番目という点です。例えば、list_1Dの先頭の要素を取得したい場合は以下のように書きます。
list_1D[0]
>> 1
list_2Dでも同様に先頭の要素を指定してみます。
list_2D[0]
>> array([1, 2, 3, 4])
このように、先頭の要素を指定すると先頭の配列が取得できました。さらにこの中の先頭の要素を取得したい場合は以下のように書きます。
list_2D[0][0]
>> 1
3次元以上の場合でも、同じように後ろにつなげて指定することができます。
配列の作成
先ほども少し例に挙がっていましたが、基本的なNumPy配列の作成方法を紹介します。ここでは1次元配列を作ります。
np.array()
もっともシンプルで直感的なのがこの方法です。用意した配列を引数に渡せばNumPy配列が作成されます。
np.array([1,2,3,4,5,6])
>> array([1, 2, 3, 4, 5, 6])
np.zeros()
これを使えば、要素の値が全て0の配列が生成されます。引数には要素数を整数で指定します。
np.zeros(3)
>> array([0., 0., 0.])
np.ones()
np.zeros()と似ており、要素の値が全て1の配列を生成します。
np.ones(3)
>> array([1., 1., 1.])
np.zeros()やnp.ones()はとりあえず配列を作ってテストしたいといった場合なんかに使われます。
np.empty()
np.empty()はnp.zeros()やnp.ones()と似ていますが、使用しているメモリの状況に合わせて生成したランダムな数を要素とします。そのため、np.zeros()などよりも応答速度が速いです。
引数には要素数を指定します。
np.empty(2)
>> array([-4.05714529e-255, -3.06164429e-292]) #場合によって変わる
np.arrange()
np.array()と並んでよく使うやり方がこれです。この方法では、指定したルールに従った配列を生成することができます。
渡す引数の数によって引数の意味が変わってきます。1つだけ指定した場合の引数は要素数です。この場合、0から始まる配列が生成されます。
#引数は要素数
np.arange(5)
>> array([0, 1, 2, 3, 4])
引数を2つ指定した場合、1つ目は最初の要素の数、2つ目は最後を示します。最初の数から1ずつ足していった配列が生成されます。
注意点として、2つ目に指定した数は配列に含まれません。(指定した値 – 1で終わる)
#引数は最初の数、最後の数(含まない)
np.arange(5, 10)
>> array([5, 6, 7, 8, 9]) #10は含まれない
3つ引数を指定した場合、1つ目は最初の要素の数、2つ目は最後、3つ目はステップとなります。ステップとは〇個飛ばしでカウントするかということを意味します。例えばステップを2にすると偶数(奇数)のみの配列を生成できます。
#5~15まで、2飛ばしで
np.arange(5, 15, 2)
>> array([ 5, 7, 9, 11, 13])
np.linspace()
この方法では、範囲と要素数を指定し、等間隔の配列を生成することができます。引数は3つで、最初から順に最初、最後、間隔を指定します。
#0~20まで、間隔5で
np.linspace(0, 20, 5)
>> array([ 0., 5., 10., 15., 20.])
配列の操作(ソート、要素の追加・削除)
続いては配列の簡単な操作について紹介します。
ソート
要素のソーティング(並び替え)をするには、np.sort()を用います。引数にはソーティングをしたい配列を渡します。例えば、以下のような配列があったとします。
a = [4,1,5,3,9,6,6,8]
この配列を、np.sort()を使って要素を並び替えてみます。
np.sort(a)
>> array([1, 3, 4, 5, 6, 6, 8, 9])
デフォルトでは昇順に並び替えることができます。降順で並び替えたい場合は以下のようにします。
np.sort(a)[::-1]
>> array([9, 8, 6, 6, 5, 4, 3, 1])
要素の追加
配列に要素を追加する方法はいくつかあります。配列の先頭や末尾に要素を追加したい場合はno.append()を使います。
a = [1, 2, 3]
#先頭に要素を追加
np.append(0, a)
>> array([0, 1, 2, 3])
#末尾に要素を追加
np.append(a, 4)
>> array([1, 2, 3, 4])
配列の任意の場所に要素を追加したい場合は、np.insert()を用います。引数は3つあり、最初から順にベースとなる配列、追加する位置、追加する要素です。
#2番目の位置に要素を追加
a = [1, 2, 3]
np.insert(a, 2, 10)
>> array([ 1, 2, 10, 3])
要素の指定は0番目から始まるので、2番目を指定すると3つ目ということになります。
要素の削除
配列の要素を削除する方法もいくつか存在します。配列の端の要素を削除したい場合は、残したい要素だけを指定すればOKです。
#先頭から6番目まで
a = [1, 3, 4, 5, 6, 6, 8, 9]
a[:6]
>> [1, 3, 4, 5, 6, 6]
#3番目から最後まで
a[3:]
>> [5, 6, 6, 8, 9]
任意の場所の要素を削除したい場合はnp.delete()を用います。対象とする配列と、削除したい要素の位置を指定します。
a = [1, 3, 4, 5, 6, 6, 8, 9]
#3番目の要素を削除
np.delete(a, 3)
>> array([1, 3, 4, 6, 6, 8, 9])
Pythonでデータサイエンスするなら
Pythonでデータサイエンスをするなら、以下の書籍がおすすめです。Pandas、matplotlib、Numpy、scikit-learnといったデータサイエンスに必要なライブラリを、体系立てて一通り学ぶことができます。
ややお値段高めですが、これ1冊で十分という内容・ボリュームなので、損はしないと思います^^
まとめ
NumPyのインストールから配列の構造や要素の操作について紹介しました。NumPyはPythonのライブラリの中でもとりわけよく用いられるライブラリの1つです。
基本的な使い方は必ず知っておくことをオススメします^^
次回も、NumPyについてさらに掘り下げていければと思います。
ではでは👋