機械学習 & ディープラーニング入門(データ構造編)[Lesson 2]

機械学習 & ディープラーニング入門(データ構造編)[Lesson 2]

機械学習に欠かせない、NumPy入門と「多次元配列(ndarray)」

2019年2月5日

機械学習の現場で広く活用されているライブラリ「NumPy」の概要から、「多次元配列(ndarray)」データを作成する方法について説明する。また、類似のライブラリ「Pandas」についての概要も紹介する。

一色政彦 デジタルアドバンテージ 一色 政彦

 前回は、Python言語仕様のリスト型を用いて「多次元リスト」というデータ構造を作る方法について説明した。今回は、ライブラリ「NumPy」でデータ構造を作る方法について見ていこう。脚注や図、コードリストの番号は前回からの続き番号としている。<

 本稿で示すサンプルコードの実行環境については、Lesson 1を一読してほしい。

 Lesson 1でも示したように、本連載のすべてのサンプルコードは、下記のリンク先で実行もしくは参照できる。

Google Colabで実行する
GitHubでソースコードを見る

AIプログラムにおけるデータの構造(基本編)

 前回の説明までで、機械学習やディープラーニングを実施するのに必要なデータを、Python言語で記述できるようになったはずだ。「あとは多次元リストのデータを使って、ディープラーニングしていけばいいのね」と思うかもしれない。確かにそれも不可能ではないが、実際の現場では、素のPythonデータ構造である「リスト」をそのまま使うことはあまりない。というのも、Python標準の数値計算機能は非力で、リスト構造のデータをまとめて効率的に計算できないからだ。

 そこで、機械学習・ディープラーニングといったAIプログラムのデータ処理では、より強力な、

  • 数値計算ライブラリ「NumPy」(ナムパイ)

を用いることが一般的となっている。

数値計算ライブラリ「NumPy」の特長

 NumPyの特長は、さまざまな算術・数学計算に対応しており、前回説明した多次元リスト形式のデータ構造をまとめて、しかも高速に計算できることである。要するに、数学に強いライブラリということだ。

 ただし、「扱うデータ形式が変わる」という点に注意が必要だ。具体的には、Pythonの「多次元リスト」そのものではなく、

  • NumPy独自のデータ型「多次元配列」(詳細後述)

という形式に変換したうえで、データを扱うことになる(でも安心してほしい。変換作業は、変換していること自体に気が付かないほど簡単である)。

 しかも、多次元配列のデータ構造は、多次元リストのデータ構造とまったく同じである。要は、数学計算機能を持たせるために、多次元リストと同形式のデータ構造を別に用意しているにすぎないのだ。Python言語のリストの知識があれば、それほど勉強しなくてもすぐに使いこなせるようになる、よくできたライブラリである。

 実際にNumPyはとても有名で、よく使われており、データサイエンティストを中心にデータ分析業務に携わる人たちに愛されている。現在のPython人気の一部は、このNumPyの人気から来ている、と言っても過言ではないだろう。それほど使い勝手がよい。

 さっそく、NumPyを使う方法を示し、サンプルコードを実行することでそのデータ構造を確かめてみよう。

【コラム】Pythonの基礎知識:パッケージ/モジュール/クラス/メソッド/関数など

 Pythonでのライブラリlibrary)のインストール方法、およびパッケージpackage)やモジュールmodule)といったPython言語の基本仕様について知らない場合は、記事『機械学習 & ディープラーニング入門(Python編): Lesson 2. モジュール』を一読することをお勧めする。本連載では、その記事と同等の知識があるものとして説明を進める。

 その他、下記のプログラミング用語が、以下の本文中で使われているので、知らない場合は参考にしてみてほしい。

 クラスclass)とは、オブジェクト(後述)を生成するための元となる遺伝子情報あるいは設計図のようなものである。

 オブジェクトobject)については、前回の「【コラム】Pythonで数値を表現するための基礎知識」で紹介済みなので、説明は割愛する。

 コンストラクターconstructor)とは、クラスからオブジェクトが生成されるタイミングで呼び出されるメソッド(後述)のことで、そのメソッド内では主にオブジェクトの初期化処理を実施する。

 メソッドmethod)とは、クラス内で定義された関数(後述)のことである。

 関数function)とは、入力として引数(ひきすう)を受け取り、内部で何らかの処理を実施し、最後に出力として戻り値(もどりち)を返すという特徴がある。

NumPyのインストール

 ライブラリ「NumPy」は、PyPI(Python Package Index: Pythonの各種パッケージが登録されているサービス)から配布用プロジェクト(=PyPIにおけるパッケージ)をインストールする必要がある。ただし、前回から引き続き使用するPythonコードの実行環境「Google Colaboratory」(以下、Google Colab)には、NumPyが最初からインストール済みなので、今回も実質的にはインストールなしで利用できる。

 ちなみに、通常のJupyter Notebookなど、NumPyが未インストールの環境であれば、コードセルに次のシェルコマンドを入力して明示的にnumpy配布用プロジェクトをインストールする必要があるので注意してほしい。

Python
!pip install numpy
リスト5-1 numpy配布用プロジェクトをインストールするためのシェルコマンド

先頭にある!は、コードセルからシェルコマンドを実行するための、Jupyter Notebook/Google Colab独自の特殊機能である。

numpyモジュールのインポート

 それではNumPyを利用してみよう。まずはモジュールのインポートである。慣例では「np」という名前で、numpyモジュールをインポートする(リスト5-2)。

Python
import numpy as np
リスト5-2 numpyモジュールをインポートするコード例

NumPyのデータ型「多次元配列」オブジェクトの作成

 Python言語の多次元リスト(Multi-dimensional list)に対応するNumPyのデータ型は、すでに紹介したが「多次元配列」(=N次元配列:N-dimensional array、略してndarray)である(=配列とリストは同じように多次元のデータ構造を表現できるオブジェクトで、要素の追加などで使い勝手が違う部分もあるものの、多次元リストと多次元配列の意味はほぼ同じだと捉えてよい)。ndarrayはコレクション機能を持つPythonクラスとして提供されており、NumPyのメイン機能である。

 「ndarrayがどのようなクラスか」を知るために、公式のAPIリファレンス(numpy.ndarray)を見てみよう(図6-1)。

図6-1 NumPyのndarrayクラスのAPIリファレンス(抜粋)

 class numpy.ndarrayという記述から、numpy<モジュール階層>の配下にあるndarrayクラスであることや、そのコンストラクターがshapedtype=floatbuffer=Noneoffset=0strides=Noneorder=Noneといった引数を持っていることが分かる(青色の枠)。

 また、このクラスに対する説明として「多次元配列を表現するオブジェクト」と記載されている(緑色の枠)。

 そして、「配列はarrayzerosemptyを使って構築するのを推奨する」との注意書きがある(赤色の枠)。これに従って、ndarrayクラスのコンストラクターではなく、arrayから多次元の配列オブジェクトを作成してみよう*3

  • *3 zerosemptyは、arrayほど使われないので、説明を割愛する。

 arrayの詳細を調べるために、図6-1にある[array]リンクをクリックして開いたのが、図6-2のページだ。

図6-2 NumPyのarray()関数のAPIリファレンス(抜粋)

 これについても、numpy.arrayという記述から、numpy<モジュール階層>の配下にarray()関数があることや、その引数としてobjectdtype=Nonecopy=Trueorder='K'subok=Falsendmin=0が定義されていることが分かる(青色の枠)。

 また、この関数に対する説明として「配列を作成する」と記載されている(緑色の枠)。この関数を呼び出すことで、ndarrayクラスをインスタンス化した多次元配列オブジェクトが作成できそうだ。

 実際に下の方の[Returns](戻り値)欄を見てみると、ndarray型のオブジェクトを返す、と記載されている。

 よって、array()関数を呼び出すコードを書くが、関数の引数について、今回は特に重要なobjectdtypeについてのみ説明しておこう。

 objectには、Pythonのリスト値や多次元リスト値を指定できる。多次元リスト値を代入済みの変数を指定してもよい。

 dtypeは、NumPyが使えるデータ型を指定する。基本的には、前回の「【コラム】Pythonで数値を表現するための基礎知識」で説明したデータ型である数値型(intfloat)に加え、正(True)か偽(False)かという値を扱うブール型(bool)が使える。例えば実数(厳密には浮動小数点数)を使うのなら、floatと指定する。なお、コンストラクターの構文で=floatとデフォルト引数(=指定しない場合に既定値として使われる値を持つ引数)が定義されているので、floatならば指定を省略可能だ。機械学習やディープラーニングを使う場面ではfloatを使うことが多いので省略するケースがほとんどだろう。

 それでは、前回のリスト3と同じ3行2列の2次元配列を作ってみよう。

Python
array2d = np.array([ [ 165.5, 58.4 ],
                     [ 177.2, 67.8 ],
                     [ 183.2, 83.7 ] ])

array2d  # array([[165.5,  58.4],
         #        [177.2,  67.8],
         #        [183.2,  83.7]])
リスト5-3 array関数で多次元配列を作成するコード例(値を使用)

 また、前回のリスト4で多次元リスト値を代入した変数list3dを指定して、次のように多次元配列を作成することも可能だ。

Python
array3d = np.array(list3d)

array3d  # array([[[165.5,  58.4],
         #         [177.2,  67.8],
         #         [183.2,  83.7]],
         #
         #        [[155.5,  48.4],
         #         [167.2,  57.8],
         #         [173.2,  73.7]],
         #
         #        [[145.5,  38.4],
         #         [157.2,  47.8],
         #         [163.2,  63.7]]])
リスト5-4 array()関数で多次元配列を作成するコード例(変数を使用)

 要は、array()関数を使うと、多次元リスト値から、多次元配列オブジェクトへ変換できるというわけである。

「多次元配列」オブジェクトから多次元リスト値への変換

 ちなみに逆に、NumPyの多次元配列オブジェクトから、Python標準の多次元リスト値に変換したいこともある。この場合は、ndarrayクラスのtolist()メソッドを使えばよい。引数はないので、リスト5-5のようにして呼び出せる。

Python
tolist3d = array3d.tolist()

tolist3d  # [[[165.5, 58.4], [177.2, 67.8], [183.2, 83.7]],
          #  [[155.5, 48.4], [167.2, 57.8], [173.2, 73.7]],
          #  [[145.5, 38.4], [157.2, 47.8], [163.2, 63.7]]]
リスト5-5 ndarrayクラスのtolist()メソッドで多次元リストに変換するコード例

「多次元配列」データを使った数学計算は次回

 あとは、多次元配列データを使って好きな数学計算をしていけばよい。NumPyには、一通りの数学計算機能が関数として提供されている。次回、その関数について紹介し、実際にサンプルコードで計算する例を示す。

AIプログラムにおけるデータの構造(応用編)

 以上で説明したNumPyの多次元配列は、ライブラリ「TensorFlow」を使う場合でも活用することになる。具体的には、AIプログラムにデータを読み込んで前処理する際や、そのデータをTensorFlowの処理に入力する際などである。

 NumPyだけで何でもできそうな雰囲気だが、NumPyはあくまで「数値計算」のライブラリである。機械学習・ディープラーニングといったAIプログラムを作成している段階では、データの内容を確認・解析しながら、データに関する作業を進めたい場面が多い。特に複雑なデータであればなおさらだ。

 そのような場面で、

  • データ解析支援ライブラリ「Pandas」(パンダス*4

を用いることが多い。少し脱線するがせっかくなので、Pandasについても、最後に簡単に紹介しておきたい。

  • *4 【余談】英語的に「パンダズ」とも読まれる。「News」を日本では「ニュース」と呼ぶが、英語で厳密には「ニューズ」と発音しているのと同じパターン。ちなみに、あるネイティブの英語の先生は、日本人が「ニュース」と発音しているのに気付いていなかったので、最後の「ズ」は比較的音が小さくて聞き手にとって微妙な違いでしかないと思われる。「パンダズ」と濁音の「ズ」にしたくても、その音を強調しない限り、明確に「ズ」と発音しにくいので、「ス」に近い音になるのではないだろうか。とりあえず「パンダス」と呼んでおけば問題ないだろう。

Pandasのインストール

 ライブラリ「Pandas」も、NumPyと同様で、Google Colabではインストール不要だ。未インストールのJupyter Notebook環境では、リスト6のようにしてインストールできる。

Python
!pip install pandas
リスト6 pandas配布用プロジェクトをインストールするためのシェルコマンド

データ解析支援ライブラリ「Pandas」の特長

 Pandasの特長は、多次元リスト構造のデータ(正確には2次元の表データ)を、ファイルやデータベースから読み取ったり(=入力機能)、その表データをユーザー(ここではプログラミングをしている人)に一覧表として表示したり(=出力機能)(図7-1)、表データとして合計や平均などの統計値を算出したり(=表計算・統計機能)できることだ。

 Pandasは、NumPyのデータ構造「多次元配列」を受け取って処理できるので(図7-1)、NumPyとの親和性も高く、AIプログラムの作成でシームレスに活用できる。

NumPyのデータをPandasで一覧表として表示する例
図7-1 NumPyのデータをPandasで一覧表として表示する例

1行目: Pandasでは、慣例では「pd」という名前で、pandasモジュールをインポートする。
2行目: 引数として指定したarray2dは、リスト5-3で宣言した変数で、NumPyの2次元配列のデータである。

 ただしPandasでも、「扱うデータ形式が変わる」ことに注意が必要だ。具体的には、Pythonの「多次元リスト」や、NumPyの「多次元配列」そのものではなく、

  • Pandas独自のデータ型「データフレーム」(DataFrame

という形式に変換したうえで、データを扱うことになる。

 Pandasの機能は、前述のとおり、複雑なデータになってくると欲しくなるが、例えば『Playgroundで学ぶディープラーニング入門(座標点データ編)』(後日公開予定)で扱う座標点データなどは比較的シンプルなデータなのでPandasを利用するほどではない。よって本連載でも、詳しい説明は割愛する。

NumPyの「多次元配列」と他のライブラリとの関係

 PandasのようにNumPyの多次元配列を受け付けるライブラリは多い。本連載が意識しているディープラーニング用ライブラリの「TensorFlow」もその一つだ(図7-2)。

NumPyと各種ライブラリの関係図
図7-2 NumPyと各種ライブラリの関係図

このようにNumPyは、いわば「Python言語の標準機能」と言えるほどの、中心的な扱いとなっている。

 TensorFlowのデータ構造には、前述のNumPyやPandasと同様に、

  • TensorFlow独自のデータ型「テンソル」(Tensor

という独自形式が採用されている。テンソルについて、今回は説明を割愛する。数学にも「テンソル」という概念があるので、これについて次回説明する。

 ちなみに、TensorFlowの「テンソル」も数学と同じ概念を採用したものである。詳しくは、『Playgroundで学ぶディープラーニング入門(座標点データ編)』(後日公開予定)の中であらためて説明する。

つづく

 以上で、AIプログラムで使うデータの「構造」に関する説明が済んだ。基本的には、NumPyの多次元配列を使うのがお勧めだ。次回、その多次元配列データを使ってどのように計算するのか、について説明しよう。

  • このエントリーをはてなブックマークに追加
機械学習 & ディープラーニング入門(データ構造編)[Lesson 2]
1. 機械学習を始めるための、Pythonデータ構造「多次元リスト」入門

Pythonの基本的な言語仕様では、データはどう表現できるのか? 単一の数値データから始め、1次元、2次元、……多次元と複数の数値データを表現できるリスト型のデータ構造まで、ステップ・バイ・ステップで見ていく。

2019年1月23日(水)
機械学習 & ディープラーニング入門(データ構造編)[Lesson 2]
2. 【現在、表示中】≫ 機械学習に欠かせない、NumPy入門と「多次元配列(ndarray)」

機械学習の現場で広く活用されているライブラリ「NumPy」の概要から、「多次元配列(ndarray)」データを作成する方法について説明する。また、類似のライブラリ「Pandas」についての概要も紹介する。

2019年2月5日(火)
機械学習 & ディープラーニング入門(データ構造編)[Lesson 2]
3. NumPyによる数学計算と、数学用語の「テンソル」

NumPyのデータ構造「多次元配列」を使って数学計算を行う方法を説明。また、そもそも機械学習やディープラーニングでは、なぜ数学計算が重要になっているのかについても言及する。

2019年2月8日(金)
機械学習 & ディープラーニング入門(データ構造編)[Lesson 2]
4. 「AIのデータ構造となるNumPyの多次元配列と、数値計算」の基礎まとめ

機械学習やディープラーニングではデータは表現できるのか? Python言語の多次元リストや、ライブラリ「NumPy」の多次元配列(ndarray)といったデータ構造とその数値計算に関する基礎の基礎を箇条書きでまとめる。

2019年2月8日(金)
Deep Insider の SNS :