[NumPy超入門]Pythonでのデータ処理をNumPyから始めよう!:Pythonデータ処理入門
NumPyってどんなもの? どんな機能があるの? ここからデータ処理の第一歩を踏み出そう。Python入門に続く入門シリーズが開始!
本シリーズと本連載について
Pythonは現在とてもよく使われるプログラミング言語の一つです。特に人工知能、機械学習、データ処理やデータ分析といった分野においてはPythonとそのライブラリはとてももてはやされています。ですが、Pythonの基礎を学んだだけで今述べたような分野に乗り出していくのは少し大変なことでもあります。
プログラミング言語だけを覚えても、その言語で何かを行うには十分ではないことはよくあります。特に複雑なことをやろうと思ったら。何かを行うためには、さまざまなライブラリやフレームワークの使い方も学ぶ必要があります。あるいは、自分でそうしたライブラリやフレームワークを構築する方法もありますが、そのためにはかなりの労力が必要となるでしょう。
何かを実現するためにその道具(ライブラリやフレームワーク)から作り始めるのは理想的です。が、例えば数値計算やデータの処理、可視化、機械学習、人工知能といった分野には既に先人たちの知恵と技術の成果があり、多くの人がそれらを使って何かを成し遂げています(もちろん他の分野でもPython向けのライブラリやフレームは充実しています。そして、そうした成果が多いことが現在のPythonの人気にもつながっているのでしょう)。
使っている人が多ければ、自分が分からないことについて調べるときにも安心です。Webを検索すれば、同じように困ったことがある人がそのことについて記録を残してくれているかもしれません(今となってはWeb検索よりもチャットボットを使った勉強の方が便利という方もいるでしょうけれど)。
本シリーズ「Pythonデータ処理入門」では「Python入門」に続くPython学習シリーズとしてPythonに関する基礎知識を備えた方々に向け、「Pythonは覚えたけど、次は何を学んで、どうやって膨大な量のデータを処理したらいいの?」というお話をしていければと思っています。
具体的には以下のようなトピックごとに数回から十数回程度の連載を通して、Pythonでデータ処理を行うために必要な知識や実際のデータ処理の方法を読者の皆さんと勉強していく予定です。
- NumPy:Pythonで数値計算や科学計算を効率的に行うためのライブラリ(本連載)
- pandas:Pythonで大量のデータの解析や処理を行うためのライブラリ
- matplotlib:Pythonで大量のデータをグラフ化/可視化するためのツール
- Pythonによるデータ処理:以上のツールを使って、実際にデータ処理を行う方法を紹介
本連載では、その第一弾として「NumPy」と呼ばれる科学計算ライブラリを取り上げます。
Pythonについては学んだけれどまだ勉強が必要なの?
Pythonにも標準で数値計算ライブラリはありますし、多くの数値データを格納するために使えるデータ構造(リストなど)もあります。では、なぜ別にツールが必要になるのでしょうか。
簡潔なコードが書ける
一つ例を出してみましょう。ここに以下のような2行2列(2×2)の行列が2つあり、それらの足し算をしたいとします。
上の画像を見れば分かる通り、その答えは全要素の値が3となります。では、これらの行列の和を求めるコードをPythonで書くとしたらどうなるでしょう。以下は一例です。
a = [[0, 1], [2, 3]]
b = [[3, 2], [1, 0]]
c = []
for row in range(len(a)):
tmp_list = []
for col in range(len(a[0])):
tmp_list.append(a[row][col] + b[row][col])
c.append(tmp_list)
print(c)
このコードでは、Pythonのリストを使って多次元配列に相当するデータを作ってから、二重ループを形成し、インデックスを用いて行列の各要素の足し算をしています。ハッキリいってメンドクサイですよね。念のため、実行結果を以下に示します(以下はVisual Studio Codeで実行したものです。以下、同様)。
「インデックスを使うなんてPythonぽくないよねー」という方なら次のように書くかもしれません。
a = [[0, 1], [2, 3]]
b = [[3, 2], [1, 0]]
c = []
for a_items, b_items in zip(a, b):
tmp_list = []
for a_item, b_item in zip(a_items, b_items):
tmp_list.append(a_item + b_item)
c.append(tmp_list)
print(c)
いずれにせよ、二重のループで対応する要素を取り出して加算して、それをまたリストを要素とするリストに追加していくという形に変わりはありません。
NumPyを使えば、この処理は以下のように書けます。なお、NumPyを使ったコードについてはここでは深く理解する必要はありません(numpy.array関数はNumPyが提供する配列であるndarrayオブジェクトを生成する関数であり、以下では2次元配列を作成していると考えてください)。
import numpy as np
a = np.array([[0, 1], [2, 3]]) # numpy.array関数を呼び出して多次元配列を作成
b = np.array([[3, 2], [1, 0]])
c = a + b
print(c)
強調書体で表示した「c = a + b」という部分を見てください。NumPyを使うと、ループを書いて各要素を足し算して……のようなことを全く考えないで単純に足し算をするだけで済んでしまいます。今の例は2次元(行列)でしたが、データの1次元の並びであるベクトルや、2次元以上の配列であってもこれは同じです。そして、このような記述の仕方をNumPyでは「ベクトル化(vectorization)」(ベクトル化記法)などと呼びます。
こちらも念のために実行結果を示しておきましょう。PythonのリストとNumPyのndarrayオブジェクトとで表示に差はありますが、計算結果は同一です。
実際のところは、単に記述がシンプルになるだけではありません。こうしたコードの多くは、実際にはCを使って記述/コンパイルされたコードにより実行されます。そのため、Pythonのforループで各要素の足し算を行うよりも、はるかに高速に実行できるのです。
同じことをするコードを素のPythonよりもスッキリと記述できること。配列の演算が高速に行えること。これらはNumPyを使うことの大きなメリットといえます。
面倒なことはNumPyがよろしくやってくれる
もう1つ「ブロードキャスト」という機構も紹介しておきましょう。
ブロードキャストとは「異なるサイズのndarrayを演算する際に、それらのサイズがあたかも同じであるかのように処理する」機構のことです。
Copyright© Digital Advantage Corp. All Rights Reserved.