【NumPy入門 第1回】データサイエンスの必需品!NumPyとは?インストールと配列`ndarray`作成の超基本 🚀

「Pythonで大量の数値を扱いたいけど、リストだと処理が遅いって聞くし…」
「データ分析や機械学習を始めるには、まず何を学べばいいの?」
「NumPy(ナムパイ)ってよく聞くけど、一体何ができるライブラリなの?」

こんにちは! Pythonistaの皆さん、前回までは標準ライブラリについて学んできました。

ここからは新たな冒険の始まりです! これまでPythonの基本や便利な標準ライブラリを探求してきましたが、今回からはPythonを科学技術計算やデータサイエンスの分野で非常に強力なツールへと進化させる外部ライブラリの世界へ足を踏み入れます。その第一歩として、数値計算の基盤となる超重要ライブラリ、NumPy (Numerical Python) を数回に分けて徹底解説していきます!

第1回の今回は、まず「なぜNumPyが必要なのか?」という基本的な疑問から始め、NumPyのインストール方法、そしてNumPyの最も中心的なデータ構造である多次元配列ndarrayの作成方法と、その基本的な性質(属性)について学んでいきましょう。この記事を読めば、NumPyの魅力と、Pythonでの数値データの扱い方がガラッと変わる可能性を感じていただけるはずです!


1. NumPyとは? なぜPythonのリストだけではダメなの? 🤔

NumPy (ナムパイ) は、Pythonで数値計算を効率的に行うための基本的なパッケージ(ライブラリ)です。特に、大きな多次元配列や行列の操作に優れており、その上に構築される多くの科学技術計算ライブラリ(例: SciPy, Pandas, Matplotlib, Scikit-learnなど)の基盤となっています。

「でも、Pythonには元々リストがあるじゃない?それで数値を扱えばいいのでは?」と思うかもしれません。確かにリストでも数値の集まりを表現できますが、NumPyの配列(ndarray)には、リストと比べて数値計算を行う上で以下のような大きなメリットがあります。

  • 高速な処理速度 💨: NumPyの配列操作の多くは、C言語などの低レベル言語で実装されているため、Pythonのリストを使ったループ処理に比べて格段に高速です。大量のデータを扱う場合、この速度差は非常に大きな意味を持ちます。
  • メモリ効率の良さ 💾: NumPyの配列は、同じデータ型の要素を連続したメモリ領域に格納するため、Pythonのリスト(様々なデータ型を格納でき、各要素がバラバラのメモリ位置を参照する可能性がある)よりもメモリの使用効率が良い傾向があります。
  • 便利な数学関数とブロードキャスト機能 🧮: 配列全体の各要素に対して一度に演算を適用できる「ユニバーサル関数(ufunc)」や、形状の異なる配列間でも賢く演算を行える「ブロードキャスト」といった強力な機能が備わっています。これにより、複雑な数値計算も簡潔なコードで記述できます。
  • 多次元配列のサポート ▦:ベクトル(1次元配列)、行列(2次元配列)、さらには3次元以上の配列も簡単に扱うことができ、線形代数演算などの高度な数学的操作もサポートしています。

簡単に言えば、NumPyは「Pythonで大きな数値の集まりを扱うなら、これを使わない手はない!」というくらいパワフルで便利なライブラリなのです。


2. NumPyのインストール:冒険の準備をしよう! 🛠️

NumPyは外部ライブラリなので、利用する前にインストールが必要です。Pythonのパッケージ管理ツールであるpipを使って、コマンドプロンプトやターミナルから以下のコマンドを実行してください。

pip install numpy

通常はこれだけでインストールが完了します。もし「pipって何?」という方や、Anacondaなどの環境を使っている方は、それぞれの環境に合わせたNumPyの導入方法を確認してみてください(多くの場合、Anacondaには最初からNumPyが含まれています)。

インストールが完了したら、Pythonスクリプトや対話モードでNumPyをインポートして使えるようになります。NumPyは慣習的にnpという別名でインポートされます。

import numpy as np

これでNumPyを使う準備が整いました!


3. NumPyの主役!ndarrayオブジェクトとは? 🌟

NumPyの最も基本的なデータ構造が、N次元配列オブジェクト (N-dimensional array)、通称ndarrayです。これは、同じデータ型の要素からなる、多次元のグリッド(格子状のデータ構造)と考えることができます。

  • 1次元配列は「ベクトル」
  • 2次元配列は「行列」
  • 3次元以上の配列も扱えます。

全ての要素が同じデータ型であるという点が、Pythonのリスト(異なるデータ型を混在可能)との大きな違いの一つです。これにより、メモリ効率や計算速度が向上します。


4. 様々な方法で`ndarray`を作成してみよう! 🛠️

NumPyには、ndarrayを作成するための様々な関数が用意されています。ここでは代表的なものをいくつか見ていきましょう。

4.1. Pythonのリストやタプルから作成:np.array()

最も基本的な作成方法は、Pythonのリストやタプルのリスト(ネストされたリスト)をnp.array()関数に渡すことです。

import numpy as np

# 1次元配列の作成
list1 = [1, 2, 3, 4, 5]
arr1 = np.array(list1)
print(f"1次元配列 arr1:\n{arr1}")
print(f"arr1の型: {type(arr1)}")

# 2次元配列の作成 (リストのリストから)
list2 = [[1, 2, 3], [4, 5, 6]]
arr2 = np.array(list2)
print(f"\n2次元配列 arr2:\n{arr2}")

# データ型を明示的に指定することも可能
arr_float = np.array([1, 2, 3], dtype=float)
print(f"\nfloat型の配列 arr_float:\n{arr_float}") # [1. 2. 3.] と表示される

実行結果 (例):

1次元配列 arr1:
[1 2 3 4 5]
arr1の型: <class 'numpy.ndarray'>

2次元配列 arr2:
[[1 2 3]
 [4 5 6]]

float型の配列 arr_float:
[1. 2. 3.]

4.2. 特定の値で埋められた配列の作成:np.zeros(), np.ones(), np.full()

  • np.zeros(shape, dtype=float): 全ての要素が0で埋められた配列を作成します。shapeはタプルで配列の形状(各次元の要素数)を指定します。
  • np.ones(shape, dtype=float): 全ての要素が1で埋められた配列を作成します。
  • np.full(shape, fill_value, dtype=None): 全ての要素が指定したfill_valueで埋められた配列を作成します。
import numpy as np

# 全て0の2x3配列 (2行3列)
zeros_arr = np.zeros((2, 3))
print(f"\n全て0の2x3配列:\n{zeros_arr}")

# 全て1の3x2配列 (整数型)
ones_arr = np.ones((3, 2), dtype=int)
print(f"\n全て1の3x2整数配列:\n{ones_arr}")

# 全て7で埋められた2x4配列
full_arr = np.full((2, 4), 7)
print(f"\n全て7の2x4配列:\n{full_arr}")

実行結果 (例):

全て0の2x3配列:
[[0. 0. 0.]
 [0. 0. 0.]]

全て1の3x2整数配列:
[[1 1]
 [1 1]
 [1 1]]

全て7の2x4配列:
[[7 7 7 7]
 [7 7 7 7]]

4.3. 連番や等間隔の配列の作成:np.arange(), np.linspace()

  • np.arange([start,] stop[, step,], dtype=None): Pythonのrange()関数に似ていますが、浮動小数点数も扱え、結果としてNumPy配列を返します。stopの値は含まれません。
  • np.linspace(start, stop, num=50, endpoint=True, dtype=None): startからstopまでの範囲を、num個の等間隔な数値で区切った配列を生成します。endpoint=True (デフォルト) の場合、stopの値も配列に含まれます。
import numpy as np

# 0から9までの整数の配列 (10は含まない)
arange_arr1 = np.arange(10)
print(f"\n0から9までの配列:\n{arange_arr1}")

# 1から10まで、ステップ2の配列 (10は含まない)
arange_arr2 = np.arange(1, 10, 2)
print(f"\n1からステップ2の配列:\n{arange_arr2}") # [1 3 5 7 9]

# 0から1までを5等分した配列 (両端を含む)
linspace_arr1 = np.linspace(0, 1, 5)
print(f"\n0から1を5等分 (両端含む):\n{linspace_arr1}") # [0.   0.25 0.5  0.75 1.  ]

# 0から10までを4等分 (終点を含まない)
linspace_arr2 = np.linspace(0, 10, 4, endpoint=False)
print(f"\n0から10を4等分 (終点含まず):\n{linspace_arr2}") # [0.  2.5 5.  7.5]

これらの関数は、テストデータやグラフ描画用のデータを作成する際によく使われます。

4.4. その他の配列作成関数 (簡単に紹介)

  • np.eye(N, M=None, k=0, dtype=float): 単位行列(対角要素が1で、それ以外が0の行列)を作成します。
  • np.random.rand(d0, d1, ..., dn) / np.random.randn(d0, d1, ..., dn) / np.random.randint(low, high=None, size=None, dtype=int): 様々な分布に従う乱数で配列を生成します(これらはrandomモジュールとは別のNumPy独自の乱数生成機能です。次回以降で詳しく触れるかもしれません)。
import numpy as np

# 3x3の単位行列
identity_matrix = np.eye(3)
print(f"\n3x3単位行列:\n{identity_matrix}")

# 0から1の一様乱数で2x2配列を作成
random_arr = np.random.rand(2, 2)
print(f"\nランダムな2x2配列:\n{random_arr}")

5. ndarrayの重要な属性:配列の情報を知る ℹ️

作成したNumPy配列 (ndarray) は、その配列自身に関する情報を持ついくつかの便利な「属性」を持っています。

  • ndarray.ndim: 配列の次元数 (軸の数)。例えば、1次元配列なら1、2次元配列なら2
  • ndarray.shape: 配列の形状。各次元の要素数をタプルで返します。例えば、2行3列の配列なら(2, 3)
  • ndarray.size: 配列内の全要素数。shapeの各要素の積と同じです。
  • ndarray.dtype: 配列内の要素のデータ型。例えば、int64 (64ビット整数)、float64 (64ビット浮動小数点数)、bool (ブール型)など。
  • ndarray.itemsize: 配列の各要素が占めるメモリサイズ(バイト単位)。
  • ndarray.data: 配列の実際の要素を格納しているメモリバッファ(通常は直接アクセスすることは少ないです)。

サンプルコード:

import numpy as np

arr_info = np.array([[1.0, 2.5, 3.2], [4.8, 5.1, 6.9]])

print(f"\n--- 配列 arr_info の属性 ---")
print(f"arr_info:\n{arr_info}")
print(f"次元数 (ndim): {arr_info.ndim}")     # 2
print(f"形状 (shape): {arr_info.shape}")   # (2, 3)
print(f"全要素数 (size): {arr_info.size}")   # 6
print(f"データ型 (dtype): {arr_info.dtype}") # float64 (環境による場合あり)
print(f"要素ごとのバイト数 (itemsize): {arr_info.itemsize}") # 8 (float64の場合)

arr_int = np.array([10, 20, 30], dtype=np.int32)
print(f"\n--- 配列 arr_int の属性 ---")
print(f"arr_int:\n{arr_int}")
print(f"データ型 (dtype): {arr_int.dtype}") # int32
print(f"要素ごとのバイト数 (itemsize): {arr_int.itemsize}") # 4 (int32の場合)

これらの属性を確認することで、配列がどのような構造やデータ型を持っているかを把握できます。


まとめ:NumPy配列作成の第一歩を踏み出そう!

今回は、NumPyシリーズの第1回として、以下の内容を学びました。

  • NumPyとは何か、Pythonのリストと比較したメリット(速度、メモリ効率、便利な機能)。
  • NumPyのインストール方法 (pip install numpy)。
  • NumPyの基本的なデータ構造であるndarrayオブジェクトの概要。
  • 様々な方法でのndarrayの作成:
    • np.array(): Pythonのリストから作成。
    • np.zeros(), np.ones(), np.full(): 特定の値で埋められた配列を作成。
    • np.arange(), np.linspace(): 連番や等間隔の配列を作成。
  • ndarrayの主要な属性 (ndim, shape, size, dtype) とその確認方法。

これで、NumPyの世界への扉が開かれました! NumPy配列は、Pythonで効率的な数値計算を行うための強力な基盤です。次回は、作成したNumPy配列に対して、どのように要素にアクセス(インデックス参照、スライシング)したり、様々な計算(配列演算、数学関数)を行ったりするのかを詳しく見ていきます。

ぜひ、今回学んだ配列作成方法を色々試して、NumPy配列の便利さを実感してみてください。お楽しみに!

【NumPy入門 第2回】配列操作の基礎!インデックス参照・スライシング・算術演算・ブロードキャスト・便利な数学関数 (ufunc) 徹底解説

その他の投稿はこちら

コメント

このブログの人気の投稿

タイトルまとめ

これで迷わない!WindowsでPython環境構築する一番やさしい方法 #0

【Python標準ライブラリ完結!】11の冒険をありがとう!君のPython力が飛躍する「次の一歩」とは? 🚀