AI(人工知能)でひんぱんに使用されているPythonの拡張モジュールNumPy(ナンパイ)について、これからAI(人工知能)の勉強と開発に取り組むならインストールから使い方について知っておきたいですよね。
NumPyとはAI(人工知能)のデータ処理に必要な数値計算*1が実行できるPythonの拡張モジュール*2。
一般的にAI(人工知能)は人間のような考え方、感情をもったコンピュータというイメージを持つ方が多いようですが、実際のAI(人工知能)は課題に対してさまざまなデータを利用して予測や判断をしていくシステムを持ったコンピュータです。
そのためAI(人工知能)にとってデータ処理はとても重要なプロセスであり、その中でひんぱんに使用されているのがNumPyです。
ではなぜNumPyがAI(人工知能)で多用されているのでしょうか。
そこでNumPyがAI(人工知能)の中でどのような役割をしているのか、そしてNumPyのインストール方法と基本的な機能などの使い方についてお伝えします。
Pythonモジュール「NumPy」とは
NumPyがAI(人工知能)のデータ処理で頻繁に利用される要因の1つに「Pythonの拡張モジュール(ライブラリ)だから」という理由があります。
ではなぜ「Pythonの拡張モジュール」だから利用されているのでしょうか。
そしてその理由には大きく2つあり、1つは「プログラムの作成しやすさ」です。
しかしそんなPythonにもデメリットがありそれが実行速度の遅さです。
インタプリタ型のPythonはプログラムを作成しやすい反面、C言語などのコンパイラ型とくらべてプログラムの実行速度が遅くなる欠点があります。
しかしそこでPythonのデメリットをカバーするのがNumPyなどの拡張モジュールなのです。
NumPyでデータ処理速度を高速化
Pythonはもともと科学技術計算が行いやすいプログラミング言語として開発されました。
もちろん機械学習のプロセスにもデータ処理があり、複雑な計算を高速で行えるプログラムが必要です。
そこでPythonを使うとNumPyなどの拡張モジュールが使用できるので、それが多くのAI(人工知能)開発でPythonが標準使用されている、もう1つの大きな理由になります。
ではなぜデータ処理に必要なプログラムが拡張モジュールという別の形で存在しているのでしょうか。
その理由についても大きく2つあります。
pythonでもデータ処理のプログラムを作成することは可能ですが、先ほど説明したように実行速度が遅いという欠点があり、例えばC言語なら約1分で終わる処理がpythonでは約2時間もかかってしまう場合もあります。
そこでpythonの実行速度の遅さを補うために存在しているのがNumPyなどの拡張モジュールです。
NumPyでは実行速度を上げるためにpythonよりも実行速度が速い、コンパイラ型のC言語とFortran言語で開発してデータの高速処理を実現しています。
ではいよいよNumPyのインストールについて紹介していきましょう。
pythonに拡張モジュールNumPyをインストールしよう
NumPyのインストール方法は主に2つあり、その1つがAnaconda(アナコンダ)をインストールする方法です。
Anacondaをインストールする場合は次のサイトを参照してください。
そしてNumPyをインストールするもう1つの方法はpipを利用したインストールです。
NumPyのインストールとインポート
pip*5を使ったNumPyのインストール方法はいたって簡単です。
Windowsの場合なら次のコマンドを入力してください。
python -m pip install numpy
このコマンド入力でNumPyのインストールが実行されます。
その方法ではまずコマンドプロンプトでpythonを使えるようにするために「python」とコマンド入力してEnter、その後に下記のコマンドを入力してください。
import numpy
この入力後にエラーが出なければNumPyはインストールされています。
import numpy as np
上記のコマンド入力でエラーが出なければpythonでNumPyが利用できる状態になっています。
主なNumPyのインストール方法を2つ紹介しました。
これらの方法はNumPy公式サイトのインストールガイドにも掲載されています。
コマンド入力によるインストールはそんなに難しくはありませんが、エラーが出た場合はその原因の特定と対処で煩わしい作業が必要になることもあるので、初心者はAnacondaをインストールする方がいいでしょう。
またMacでのインストールについては次のサイトをご参照ください。
NumPyの使い⽅︓「ndarray」配列
機械学習の中でNumPyの役割はAI(人工知能)の学習に利用されるデータの前処理です。その前処理でNumPyはデータの基本的な構成をとらえて扱いやすい形に整えるために使用されています。
変数とは数学のxやyと同じで「x = 3」だとしたらxが箱で3が数値になり、箱が横一列に複数並んでいたら1次元配列、個々の箱に縦列ができていくと2次元配列で、またその縦横に整列した箱の上に連なった箱が積み重なって高さが生まれると3次元配列になります。
そしてndarray配列とは「N次元配列」つまり1次元配列および多次元配列のことで、次のルールに沿って配列されます。
- 配列の各次元の要素数は同じにする。
- 配列内の要素のデータ型はすべて同じにする。
- 配列の長さを固定する。
では実際にndarray配列でどのようにデータの配列化をするのか、Pythonに標準で付属しているIDLE(総合開発環境)を使用して解説していきます。
ndarrayによる配列の生成方法
これからndarray配列の生成を説明していく前に、IDLEでNumPyが利用できるようにするためIDLE画面に
import numpy as np
と入力してNumPyが利用できる状態にしてください。
ではまず任意の「l,2,3,4,5」の数値を使用して1次元配列を生成してみます。
任意の数値で生成するndarray配列
最初に次のコマンドを入力します。
a = np.array([l,2,3,4,5])
続いて
print(a)
とコマンド入力してEnterキーを押すと[1 2 3 4 5]という結果が表示されます。
この結果がndarray配列で生成した1次元配列です。
IDLEでの表示は次のようになっています。
>>> a = np.array([l,2,3,4,5]) >>> print(a) [1 2 3 4 5]
ndarray配列による多次元配列の生成
次に多次元配列の生成として2次元配列と3次元配列を説明します。
1次元配列の場合は最初のコマンドで
a = np.array([l,2,3,4,5])
としていましたが、2次元配列では
a = np.array([[l,2,3,],[4,5,6]])
と記述し、1次元配列の外を[ ]で閉じ2次元配列を表現します。
さらに次元数を上げて3次元配列では
a = np.array([[[l,2,3,],[4,5,6]],[[7,8,9],[10,11,12,]]])
となり、ご覧のように[ ]が増えると混乱しやすい記述になるので気をつけましょう。
そしてそれぞれを実行したら次のようになります。
- 2次元配列
>>> a=np.array([[1,2,3],[4,5,6]]) >>> print(a) [[1 2 3] [4 5 6]]
- 3次元配列
>>> a=np.array([[[1,2,3], [4,5,6]], [[7,8,9], [10,11,12]]]) >>> print(a) [[[ 1 2 3] [ 4 5 6]] [[7 8 9] [10 11 12]]]
今回紹介したndarray配列の生成はNumPyの中で基本となる方法です。
そしてNumPyで行える配列の生成方法にはzeros関数を使って全要素が0の配列、ones関数で全要素が1の配列を生成する方法などがあるので、それらについてはNumPy公式サイトなどを参照してください。
NumPyの使い⽅︓ブロードキャスト
NumPyでは次元数や形状が異なるさまざまなパターンの配列を扱います。そしてNumPyでパターンの違う同士の計算を効率よくしてくれるのがブロードキャスト。
ブロードキャストは次元数や形状が異なる配列同士で四則演算などをする場合に、それらの違いを自動で補い計算を効率化させる機能です。
ではその一例として次のコマンドと結果を御覧ください。
>>> a = np.array([10, 20, 30]) >>> b = np.array([1, 1 , 1]) >>> print (a + b) [11 21 31]
上記の計算は通常のa内の各要素に1を足していく足し算です。
そして次はブロードキャストが機能している計算になります。
>>> a = np. array([10, 20, 30]) >>> print (a + 1) [11 21 31]
2つの計算を比べると通常の場合ではbという配列を用意する必要がありますが、ブロードキャストではその必要がなく和が求められています。
この簡単な計算でも1行分のコマンド入力が削減できるので、そこからもブロードキャストによって計算が効率化されるのが分かります。
しかしブロードキャストはどんな配列同士の違いにも機能してくれるわけではありません。それはブロードキャストにルールが設けられているからです。
詳しいルールは公式サイトに掲載されており、その内容は大きく2つの法則から成っています。
各次元のサイズ(長さ)を揃える
例えば同じ次元の配列同士でサイズ(長さ)が異なる場合があります。
その場合はサイズが1である配列はもう一方も配列のサイズに合わせるため同じ値で引き伸ばします。
そしてコマンドで結果を出すと次のようになり、ブロードキャストによる計算が成立です。
>>> a=np. array([[1, 2,3], [4,5,6]]) >>> b=np.array([[10], [20]]) >>> print(a+b) [[11 1213] [24 25 26]]
しかしこのルールに沿っていなければエラーになります。
- エラーになった場合
>>> a=np.array([[1, 2,3], [4,5, 6]]) >>> b=np.array([[10, 20], [30, 40]) >>> print(a+b) Traceback (most recent call last): File "<pyshell#4>", line 1, in print(a+b) ValueError: operands could not be broadcast together with shapes (2,3) (2,2)
次元数を揃える
次元数が異なる配列同士の計算をする場合、次元の小さい配列の先頭にサイズが1の新しい次元を加えてサイズを揃えます。
では例として次の1次元配列と2次元配列の足し算を御覧ください。
>>> a=np.array([[1,2], [3,4]]) >>> b=np.array([10, 20]) >>> print(a+b) [[11 22] [13 24]]
上記では「 [[[1,2], [3,4]] + [10,20] 」の場合は、[10,20]に次元数を追加して[[10,20]]とします。
そして今度はサイズ引き伸ばして「 [[1, 2], [3,4]] + [[10,20], [10,20]] 」として計算。
しかしルールに当てはまらない「 [[1, 2], [3,4]] + [10,20,30] 」の場合は次元を追加してもサイズを揃えられないのでエラーになります。
>>> a=np.array([[1,2], [3,4]]) >>> b=np.array([10, 20, 30]) >>> print(a+b) Traceback (most recent call last): File "<pyshell#4>", line 1, in print(a+b) ValueError: operands could not be broadcast together with shapes (2,2) (3,)
今回紹介したブロードキャストを分かりやすく説明するために足し算で紹介しました。
この他四則演算などの計算でもルールに沿っていればブロードキャストが機能します。その詳しい内容については公式サイトなどを参照してください。
NumPyの使い⽅︓⾏列の計算
NumPyでは大量のデータ処理をまとめて扱える行列の計算が多く用いられています。
そしてNumPyで行う行列の計算はいくつかありますが、その計算の中でよく使われている行列の掛け算ついても違いが出ています。
その他の四則演算については行列もndarray配列の計算と同じ方法ですが、掛け算の場合は求める積の内容が異なります。
ではまずndarray配列での掛け算を御覧ください。
>>> a = np.array([[1,2,3],[4, 5, 6],[7,8,9]]) >>> print (a) [[1 2 3] [4 5 6] [7 8 9]] >>> >>> b = np.array([[10,20,30],[40,50,60],[70,80,90]]) >>> print(b) [[10 20 30] [40 50 60] [70 80 90]] >>> >>> c=a*b >>> print(c) [[ 10 40 90] [160 250 360] [490 640 810]]
上記したndarray配列の掛け算ではaとbのndarray配列を生成して「 c=a*b 」で結果を出しています。
そして行列の掛け算は次のような入力になります。
>>> c=np.dot(a, b) >>> print(c) [[300 360 420] [ 660 810 960] [1020 1260 1500]]
行列の場合は「dot」と呼ばれる関数を使って掛け算を行います。
そしてご覧のように両者の結果が異なりました。
つまり両者は求める積によって使い分けができるのです。
そして内積を求めたい場合にすでに生成されているndarray配列を下記のコマンドでmatrix(mat)関数を使い行列に変えて内積を求めることも可能です。
>>> c=np.matrix (a) >>> print(c) [[1 2 3] [4 561 [7 8 91 >>> d=np.matrix (b) >>> print(d) [[10 20 30] [40 50 60] [70 8090]] >>> print (c*d) [[ 300 360 420] [ 660 810 960] [1020 1260 1500]]
また次のようにndarrayの1次元配列をmatrix(mat)関数を使って行列(2次元)に生成し直すこともできます。
>>> a=np.array([1,2,3]) >>> print(a) [1 2 3] >>> >>> b=np. matrix (a) >>> print(b) [[1 2 3]]
今回紹介したNumPyで行える行列の基本的な計算について紹介しました。
もっと詳しい内容については公式サイトなどを参照してください。
NumPyの便利機能をご紹介
NumPyについてndarray配列やブロードキャスト、行列の計算の基本的な使い方について紹介してきました。
NumPyにはこの他にも便利な機能が多くあり、その中でもここでは知っておくと便利な基本機能について紹介していきます。
要素の基本的な操作
生成したndarray配列はあとで要素を操作することができます。その基本的な操作方法にはいくつかあるので、これから紹介していきましょう。
>>> a = np.array([l,2,3,4,5]) >>> print(a) [1 2 3 4 5]
要素の追加
要素の追加とはすでに生成された配列へ新たな要素を加えて生成し直す作業です。
では例としてaに「6,7,8,9,10」の要素を追加してみましょう。
まず
a2 = np. append (a, [6, 7, 8, 9, 10])
と入力した後、
print(a2)
を入力してEnter。
表示された結果が
[ 1 2 3 4 5 6 7 8 9 10]
となっていれば追加に成功しています。
>>> a2 = np. append (a, [6, 7, 8, 9, 10]) >>> print(a2) [ 1 2 3 4 5 6 7 8 9 10]
要素の設定
要素の設定とはndarray配列内の要素の値を変更する設定です。
例としてa2で配列されている要素の1を999に変えるために
a2[0] = 999
とコマンド入力します。
[0]の0は要素の順番を表すインデックス*8で要素の先頭になる1を変更するので0で指定しています。
そして
print(a2[0])
と入力して結果が下記のように
999
と表示されたら設定完了です。
>>> a2[0] = 999 >>> print(a2[0]) 999
では本当に設定できたのかa2を表示させて確認してみましょう。
print(a2)
と入力して
[999 2 3 4 5 6 7 8 9 10]
と結果が出れば成功しています。
>>> print(a2) [999 2 3 4 5 6 7 8 9 10]
要素の削除
ここでは要素の削除について説明するので、例としてa2の要素「999」を削除してみます。
要素の削除をする場合はdeleteを使用して次のコマンドを入力します。
a3 = np.delete(a2, 0)
上記のコマンドで0とはインデックスのことで、999を削除するので0を指定。
続けて
print(a3)
と入力して結果が
[ 2 3 4 5 6 7 8 9 10
]となります。
>>> a3 = np.delete(a2, 0) >>> print(a3) [ 2 3 4 5 6 7 8 9 10]
ここで紹介した3つの操作は知っておくと大変便利なので覚えておきましょう。
ndarray配列の要素数、次元数、形状の抽出
ここまでの説明でみなさんもある程度ndarray配列を見れば「次元数」や「要素数」、「サイズ」が分かるようになったのではないでしょうか。
しかし「3次元配列の生成」のところでもお伝えしたように、次元数大きくなり要素数も増えサイズも長くなるとひと目では分かりにくくなってきます。
そんなとき便利なのが配列の情報を確認できる方法です。
ここではndarray配列の要素数、次元数、形状の情報確認について説明します。
>>> b=np.array([[1,2,3], [4,5,6]]) >>> print(b) [[1 2 3] [4 5 6]]
要素数
要素数はsize属性を使用すれば各次元の要素数の合計が出ます。
>>> print(b.size) 6
次元数
次元数はndini属性を使って確認できます。
>>> print(b.ndini) 2
形状
形状はshape属性を使用して「次元数」と「各次元の要素数」で表します。
>>> print(b. shape) (2. 3)
この他にも属性を使ってndarray配列の情報を取得する方法がありますが、その他については公式サイトを参照してください。
ndarray配列の四則演算
すでにここまでの説明の中でndarray配列の四則演算のうち、足し算と掛け算を例として出していますが、ここでは改めてndarray配列の四則演算について説明します。
しかし基本的にどの計算も+、-、*、/が違うだけで形式は同じなので足し算を例に説明を進めます。
ndarray配列同士の四則演算
行列のところでも少し触れましたが、ndarray配列同士の四則演算は配列内の同じ位置に当たる要素同士で計算をします。
下記のコマンドだとaの1にはbの6を足し、続いて同じように計算をして和を出していきます。
>>> a = np.array([1,2,3,4,5]) >>> b = np.array([6,7,8,9,10]) >>> print (a+b) [ 7 9 11 13 15]
>>> c=a+b >>> print(c) [7 9 11 13 15]
1つのndarray配列の四則演算
1つのndarray配列に1を足す場合は、「 a + 1 」とします。
すると下記のようにaの各要素に1がプラスされた結果が出ます。
>>> c=a+1 >>> print(c) [2 3 4 5 6]
ここで紹介した四則演算は基本的な方法で、この他にもさまざまな形式の方法があります。
それについては下記の下記の公式サイトなどを参照してください。
今回ここで紹介したのは基本的な機能です。
しかし初心者はまず基本から確実に修得していきましょう。
NumPyはAI(人工知能)のデータ処理には欠かせないPythonの拡張モジュールです。NumPyの役割はAI(人工知能)がデータを学習しやすくするためにデータの形を整える前処理をします。
今回そんなNumPyについてインストール方法からさまざまな機能についてお伝えしてきました。
Numpyの機能にはデータ処理に必要な計算の高速化と作業の効率化を実現できるndarray配列やブロードキャスト、行列の計算などのすぐれた機能が多く備わっています。
そしてすでにNumPyを利用して開発されたAI(人工知能)は私たちの生活で利用されており、今後は時代の流れとともにAI(人工知能)が私たちの日常で存在感を強めていき、それにともなって私たちがAI(人工知能)について学ぶ機会も増えていくでしょう。
そんなAI(人工知能)を学習していく過程で必ずたどるのが機械学習、そしてNumPyです。
お伝えしたようにNumPyはAI(人工知能)を開発するためには必ず使い方を修得しておかなければいけない拡張モジュール。
PythonにはNumPy以外にもpandas、matplotlibなどの拡張モジュールがありますが、その基礎部分はNumPyを元にして作られているので、NumPyの修得はその他モジュールの修得へもつながって行きます。
このようにNumPyはAI(人工知能)のデータ処理技術においてキーポイントになので、初心者のみなさんはNumPyを確実に修得して行きましょう。
【お知らせ】
当メディア(AIZINE)を運営しているAI(人工知能)/DX(デジタルトランスフォーメーション)開発会社お多福ラボでは「福をふりまく」をミッションに、スピード、提案内容、価格、全てにおいて期待を上回り、徹底的な顧客志向で小規模から大規模ソリューションまで幅広く対応しています。
御社の悩みを強みに変える仕組みづくりのお手伝いを致しますので、ぜひご相談ください。