これまでの章で、あなたはPythonの基本的な文法と、プログラムを部品化する強力な方法を身につけました。さあ、ここからはいよいよ、Pythonを「最強の分析ツール」へと進化させる、データサイエンスの世界に足を踏み入れます!
その第一歩となるのが、今回学ぶNumPy(ナムパイ)です。
「Pythonのリストがあるのに、なぜ新しい道具が必要なの?」と思うかもしれませんね。もし、あなたが10個や100個のデータを扱うなら、確かにリストで十分です。しかし、これが100万個、1億個となったらどうでしょう?Pythonのリストは、実は大量の数値計算にはあまり向いていないのです。
NumPyは、そんな大規模な数値データを、驚くほどの速さで、そして直感的に扱うために生まれた、まさにデータ分析の心臓部とも言えるライブラリです。この章を終える頃には、その圧倒的なパワーにきっと感動するはずですよ!
NumPyの主役「ndarray」とは?
NumPyを学ぶ上で、何よりも先に理解すべき主役がいます。それがndarray
(N-dimensional array、N次元配列)と呼ばれる、NumPy特製のデータの入れ物です。
Pythonの標準のlist
(リスト)と、NumPyのndarray
は何が違うのでしょうか?
例えるなら、リストは「何でも入る魔法のポケット」です。数値、文字列、さらにはリストの中に別のリストを入れるなど、自由度は非常に高いです。しかし、その自由さゆえに、中身が整理されておらず、大量のデータを取り出して計算しようとすると、一つ一つ中身を確認する必要があり、時間がかかってしまいます。
一方、ndarray
は「きれいに整頓された卵パック」のようなものです。そこには「同じ種類(データ型)の卵(数値)」しか入れられません。そして、すべての卵は「縦×横」の格子状にきっちり配置されています。この厳格なルールのおかげで、コンピュータは「このパックの卵を全部2倍して!」といった命令を、一つ一つ確認することなく、一気に、そして超高速に実行できるのです。
この「同じデータ型」と「格子状の構造」こそが、NumPyの速さの秘密です。
NumPyを使ってみよう!配列の作り方
それでは、実際にNumPyを使ってみましょう。外部ライブラリなので、まずはimport
する必要があります。import numpy as np
と書くのが、世界中のプログラマーが使っている「お約束」の書き方です。
# NumPyライブラリを「np」という名前でインポートする
import numpy as np
ndarray
(これ以降は単に「配列」と呼びます)を作る最も基本的な方法は、Pythonのリストを材料にすることです。
# Pythonのリスト
python_list = [1, 2, 3, 4, 5]
# リストを元にNumPy配列を作成
numpy_array = np.array(python_list)
print(python_list)
print(numpy_array)
これを実行すると、見た目は似ていますが、type()
で調べてみると全くの別物であることがわかります。
[1, 2, 3, 4, 5]
[1 2 3 4 5]
numpy_array
の方は、要素を区切るカンマがありませんね。これが配列の特徴です。
もちろん、2次元の配列(行列)も作れます。リストの中にリストを入れる形で作ります。
# 2次元のリスト
python_list_2d = [[1, 2, 3], [4, 5, 6]]
# 2次元のNumPy配列を作成
numpy_array_2d = np.array(python_list_2d)
print(numpy_array_2d)
実行結果:
[[1 2 3]
[4 5 6]]
このように、きれいな行列の形で表示されます。
NumPyの真骨頂!ループが消える魔法の計算
さあ、いよいよNumPyがなぜ「必須」と言われるのか、その理由を体感してもらいます。
もし、リストの全ての要素を10倍したい場合、今までの知識だとfor
ループを使うでしょう。
python_list = [1, 2, 3, 4, 5]
result_list = []
for item in python_list:
result_list.append(item * 10)
print(result_list) # [10, 20, 30, 40, 50]
では、NumPy配列ならどうなるか見てください。
numpy_array = np.array([1, 2, 3, 4, 5])
result_array = numpy_array * 10
print(result_array) # [10 20 30 40 50]
驚きましたか? for
ループがどこにもありません!配列に対して* 10
と書くだけで、NumPyが自動的に全ての要素に対して掛け算を行ってくれるのです。
この、配列の全要素に一括で処理を適用する機能を「ブロードキャスト」あるいは「ベクトル化演算」と呼びます。これは足し算でも引き算でも、配列同士の計算でも機能します。
array_a = np.array([1, 2, 3])
array_b = np.array([10, 20, 30])
# 配列同士の足し算
sum_array = array_a + array_b
print(sum_array) # [11 22 33]
# 配列同士の掛け算
product_array = array_a * array_b
print(product_array) # [ 10 40 90]
for
文を何行も書く必要がなくなり、コードはシンプルに、そして実行速度は劇的に速くなります。これが、データサイエンスの世界でNumPyが絶対に欠かせない理由です。
狙ったデータを自在に取り出す
配列から特定のデータを取り出す方法は、リストと似ていますが、よりパワフルです。
1次元配列の場合はリストと全く同じです。
arr1 = np.array([10, 20, 30, 40, 50])
# 0から数えて2番目の要素を取り出す
print(arr1[2]) # 30
2次元配列の場合、[行番号, 列番号]
と指定することで、ピンポイントでデータを取り出せます。
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
# 0行目、2列目の要素
print(arr2[0, 2]) # 3
# 1行目、1列目の要素
print(arr2[1, 1]) # 5
リストのようにarr2[1][1]
と書くこともできますが、,
で区切る書き方の方がNumPyでは一般的で、より高度な操作(スライシング)も直感的に行えます。
まとめ:データ分析の世界へのパスポート
お疲れ様でした!今回は、データ分析の基盤となるNumPyについて学びました。
- NumPyは、大量の数値を高速に計算するためのライブラリです。
- その中心となるのが、同じ型のデータが格子状に並んだ
ndarray
(配列)です。 - 最大の魅力は、
for
ループを使わずに全要素を一度に計算できるブロードキャスト(ベクトル化演算)です。
NumPyを習得したあなたは、言うなれば「データ分析の世界へのパスポート」を手に入れたようなものです。
しかし、NumPyの配列は、あくまで数字の集まりです。実際のデータには「これは売上」「これは顧客ID」といったラベルが付いていますよね。また、データには数値だけでなく、文字列が混ざっていることもよくあります。
NumPyの配列だけでは、そうした、より複雑で現実的なデータを扱うのは少し不便です。そこで次回は、NumPyのパワーを土台に、Excelの表のように行や列に名前をつけて、データを自由自在に加工・集計・分析できる、もう一つの超強力なライブラリ「pandas」を学びます。データ分析の面白さが、さらに加速しますよ!お楽しみに!
まとめができたら、アウトプットとして演習問題にチャレンジしましょう。