Python NumPy配列操作:データ分析を加速する必須テクニック【徹底ガイド】
NumPyは、Pythonで数値計算を行う上で欠かせないライブラリです。特に、多次元配列(ndarray)を効率的に扱うための機能が豊富に用意されており、データ分析、機械学習、科学技術計算など、幅広い分野で活用されています。
この記事では、NumPy配列の基本的な操作から、高度なテクニックまでを網羅的に解説し、データ分析の現場で役立つ実践的な知識を提供します。SEO対策を意識し、Google検索で上位表示を目指して、初心者から中級者まで理解しやすいように丁寧に説明していきます。
NumPyとは? なぜNumPyを使うのか?
NumPy(Numerical Python)は、数値計算を効率的に行うためのPythonライブラリです。NumPyの主な特徴は以下のとおりです。
- 多次元配列(ndarray): 同じ型の要素が格納された多次元配列を効率的に扱うことができます。
- ベクトル演算: 配列全体に対して、要素ごとの算術演算(加算、減算、乗算、除算など)を高速に行うことができます。
- ブロードキャスト: サイズの異なる配列間でも、特定の条件下で演算を可能にする機能です。
- 線形代数、フーリエ変換、乱数生成: 高度な数学関数や、統計処理に必要な機能が豊富に用意されています。
NumPyを使うメリット
- 高速な処理速度: C言語で実装されているため、Pythonのリストと比較して、数値計算の処理速度が格段に向上します。
- メモリ効率: NumPy配列は、同じ型の要素を連続したメモリ領域に格納するため、メモリ効率が高くなります。
- 豊富な機能: 線形代数、フーリエ変換、乱数生成など、科学技術計算に必要な機能が豊富に用意されています。
- 簡潔なコード: ベクトル演算やブロードキャストを利用することで、複雑な処理を簡潔に記述できます。
NumPy配列の作成
NumPy配列を作成する方法はいくつかあります。
numpy.array()
: PythonのリストやタプルからNumPy配列を作成します。import numpy as np # リストからNumPy配列を作成 my_list = [1, 2, 3, 4, 5] arr = np.array(my_list) print(arr) # 出力: [1 2 3 4 5] # タプルからNumPy配列を作成 my_tuple = (6, 7, 8, 9, 10) arr = np.array(my_tuple) print(arr) # 出力: [ 6 7 8 9 10]
numpy.zeros()
: 全ての要素が0のNumPy配列を作成します。# 3x4の全ての要素が0のNumPy配列を作成 arr = np.zeros((3, 4)) print(arr) # 出力: # [[0. 0. 0. 0.] # [0. 0. 0. 0.] # [0. 0. 0. 0.]]
numpy.ones()
: 全ての要素が1のNumPy配列を作成します。# 2x2の全ての要素が1のNumPy配列を作成 arr = np.ones((2, 2)) print(arr) # 出力: # [[1. 1.] # [1. 1.]]
numpy.empty()
: 初期化されていないNumPy配列を作成します(高速ですが、初期値は不定です)。# 2x3の初期化されていないNumPy配列を作成 arr = np.empty((2, 3)) print(arr) # 出力: (初期値は不定) # [[6.90645313e-310 6.90645313e-310 6.90645313e-310] # [6.90645313e-310 6.90645313e-310 6.90645313e-310]]
numpy.arange()
: 等間隔の数値を持つNumPy配列を作成します。# 0から9までの整数を持つNumPy配列を作成 arr = np.arange(10) print(arr) # 出力: [0 1 2 3 4 5 6 7 8 9] # 2から20までの偶数を持つNumPy配列を作成 arr = np.arange(2, 21, 2) print(arr) # 出力: [ 2 4 6 8 10 12 14 16 18 20]
numpy.linspace()
: 指定された範囲を等間隔に分割した数値を持つNumPy配列を作成します。# 0から1までを5つの要素に分割したNumPy配列を作成 arr = np.linspace(0, 1, 5) print(arr) # 出力: [0. 0.25 0.5 0.75 1. ]
numpy.random.rand()
: 0から1の間の乱数を持つNumPy配列を作成します。# 3x2の0から1の間の乱数を持つNumPy配列を作成 arr = np.random.rand(3, 2) print(arr) # 出力: (ランダムな値) # [[0.12345 0.67890] # [0.98765 0.43210] # [0.56789 0.01234]]
NumPy配列の基本的な操作
1. 配列の形状、次元、データ型を確認
NumPy配列の形状、次元、データ型は、それぞれshape
, ndim
, dtype
属性で確認できます。
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 配列の形状
print(arr.shape) # 出力: (2, 3)
# 配列の次元
print(arr.ndim) # 出力: 2
# 配列のデータ型
print(arr.dtype) # 出力: int64 (環境によって異なる)
2. 配列の要素へのアクセス (インデキシングとスライシング)
NumPy配列の要素には、インデックスを使ってアクセスできます。多次元配列の場合、各次元のインデックスをカンマで区切って指定します。
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 1行2列目の要素にアクセス
print(arr[0, 1]) # 出力: 2
# スライシングを使って、一部分の配列を取得
print(arr[0, :]) # 出力: [1 2 3] (1行目)
print(arr[:, 1]) # 出力: [2 5] (2列目)
3. 配列の形状変更 (reshape)
reshape()
メソッドを使うと、NumPy配列の形状を変更できます。要素数は変更前後で一致している必要があります。
arr = np.arange(12) # 0から11までの整数を持つNumPy配列を作成
print(arr) # 出力: [ 0 1 2 3 4 5 6 7 8 9 10 11]
# 3x4の配列にreshape
arr_reshaped = arr.reshape((3, 4))
print(arr_reshaped)
# 出力:
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
4. 配列の連結 (concatenate, stack)
複数のNumPy配列を連結するには、numpy.concatenate()
, numpy.stack()
などが使用できます。
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
# 水平方向に連結
arr_concatenated = np.concatenate((arr1, arr2))
print(arr_concatenated) # 出力: [1 2 3 4 5 6]
# 垂直方向に連結 (2次元配列の場合)
arr3 = np.array([[1, 2], [3, 4]])
arr4 = np.array([[5, 6], [7, 8]])
arr_stacked = np.stack((arr3, arr4)) #デフォルト axis=0
print(arr_stacked)
# 出力:
# [[[1 2]
# [3 4]]
# [[5 6]
# [7 8]]]
arr_stacked_axis1 = np.stack((arr3, arr4), axis=1) # axis=1
print(arr_stacked_axis1)
# 出力:
# [[[1 2]
# [5 6]]
# [[3 4]
# [7 8]]]
5. 配列の分割 (split)
numpy.split()
を使うと、NumPy配列を指定した数に分割できます。
arr = np.arange(12)
# 3つの配列に分割
arr_split = np.split(arr, 3)
print(arr_split) # 出力: [array([0, 1, 2, 3]), array([4, 5, 6, 7]), array([ 8, 9, 10, 11])]
NumPy配列の演算
1. 要素ごとの算術演算
NumPy配列に対して、+
, -
, *
, /
などの算術演算を行うと、配列の要素ごとに演算が適用されます。
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
# 加算
print(arr1 + arr2) # 出力: [5 7 9]
# 乗算
print(arr1 * arr2) # 出力: [ 4 10 18]
2. ブロードキャスト
NumPyのブロードキャストとは、形状の異なる配列間で算術演算を可能にする機能です。
arr1 = np.array([1, 2, 3])
scalar = 2
# スカラーとの乗算(ブロードキャスト)
print(arr1 * scalar) # 出力: [2 4 6]
arr2 = np.array([[1,2,3],[4,5,6]])
arr3 = np.array([1,0,1])
# (2,3) + (3,)
print(arr2 + arr3)
# 出力
# [[2 2 4]
# [5 5 7]]
3. 集約関数 (sum, mean, max, min)
NumPyには、配列全体の合計、平均、最大値、最小値などを計算する集約関数が用意されています。
arr = np.array([1, 2, 3, 4, 5])
# 合計
print(np.sum(arr)) # 出力: 15
# 平均
print(np.mean(arr)) # 出力: 3.0
# 最大値
print(np.max(arr)) # 出力: 5
# 最小値
print(np.min(arr)) # 出力: 1
4. 行列演算 (dot, transpose, inverse)
NumPyは、線形代数に必要な行列演算機能も提供しています。
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
# 行列の積
print(np.dot(arr1, arr2))
# 出力:
# [[19 22]
# [43 50]]
# 転置
print(arr1.T)
# 出力:
# [[1 3]
# [2 4]]
# 逆行列
arr = np.array([[1, 2], [3, 4]])
try:
inv_arr = np.linalg.inv(arr)
print(inv_arr)
# 出力:
# [[-2. 1. ]
# [ 1.5 -0.5]]
except np.linalg.LinAlgError:
print("逆行列が存在しません")
NumPy配列の応用
1. 条件を満たす要素の抽出
NumPy配列に対して、条件を満たす要素を抽出することができます。
arr = np.array([1, 2, 3, 4, 5, 6])
# 3より大きい要素を抽出
condition = arr > 3
print(arr[condition]) # 出力: [4 5 6]
2. ユニバーサル関数 (ufunc)
NumPyには、sin
, cos
, exp
などのユニバーサル関数(ufunc)が用意されています。これらの関数は、配列の要素ごとに適用されます。
arr = np.array([0, 1, 2, 3])
# sin関数の適用
print(np.sin(arr))
# 出力:
# [ 0. 0.84147098 0.90929743 0.14112001]
3. NumPyを使ったデータ分析の例
import numpy as np
# 身長データ (cm)
heights = np.array([170, 175, 180, 165, 172])
# 体重データ (kg)
weights = np.array([65, 70, 75, 60, 68])
# BMIを計算
bmi = weights / (heights / 100)**2
print(bmi)
# 出力:
# [22.49134948 22.85714286 23.14814815 22.03856749 22.98578199]
# BMIが23以上の人を抽出
overweight = heights[bmi >= 23]
print(overweight)
# 出力: [180]
# 平均身長を計算
print(np.mean(heights))
# 出力: 172.4
まとめ
この記事では、NumPy配列の基本的な操作から応用までを解説しました。NumPyは、データ分析、機械学習、科学技術計算など、幅広い分野で活用される重要なライブラリです。NumPyをマスターすることで、Pythonでの数値計算を効率的に行い、より高度なデータ分析やモデル構築が可能になります。
この記事が、NumPyの学習の一助となれば幸いです。さらに深く学びたい場合は、NumPyの公式ドキュメントや、様々なオンライン教材を活用することをおすすめします。
より深く学ぶために:
- NumPy公式ドキュメント: https://numpy.org/doc/
- NumPyチュートリアル: 様々なオンラインチュートリアルサイトで、NumPyの基礎から応用まで学ぶことができます。
この記事が、あなたのデータ分析スキル向上に貢献できれば幸いです。継続的な学習と実践を通して、NumPyを使いこなし、データ分析の世界をより深く探求していきましょう。
I love codes. I also love prompts (spells). But I get a lot of complaints (errors). I want to be loved by both of you as soon as possible.
