NumPy(Numerical Python)は、Pythonで数値計算を行う際によく使われるライブラリです。
多次元配列(ndarray)を効率的に扱えるPythonのライブラリです。配列操作や数学関数、統計計算などが高速に実行できます。
この記事では、NumPyでよく使う処理をまとめました。
たまにしか使わない処理は毎回忘れてしまうので、備忘録としてまとめておきます。
ぜひ参考にしてみてください!
配列の作成
import numpy as np
# リストから配列を作成
arr_1D = np.array([1, 2, 3, 4, 5]) # 1D配列
arr_2D = np.array([[1, 2, 3],
[4, 5, 6]]) # 2D配列
# すべて0の配列
zeros = np.zeros((3, 3)) # 3x3のゼロ行列
# すべて1の配列
ones = np.ones((2, 4)) # 2x4の1行列
# 任意の値で埋める
full_array = np.full((2, 2), 7) # 7で埋められた2x2配列
# 連番の配列
arange_array = np.arange(0, 10, 2) # [0, 2, 4, 6, 8]
# 指定範囲を等間隔に分けた配列
linspace_array = np.linspace(0, 1, 5) # 0から1まで5分割
# ランダムな値を含む配列
random_array = np.random.rand(3, 3) # 0~1の一様乱数を含む3x3配列
arr_1D
とarr_2D
のshapeをprintして確認してみます。
# shapeを確認
print(arr_1D.shape)
print(arr_2D.shape)
shapeの確認結果は以下です。
(3,)
(2, 3)
NumPyの shape
を確認することで、データの整合性チェックや行列演算の適合性確認が可能になります。
行列演算や機械学習などを行う際は、shape
を確認するクセを付けておくといいでしょう!
shape
についてはこちらの記事で解説しています。目を通してみてください。
-
-
【Python】NumPyのshape属性について。配列の形状をチェックする方法
2025/2/18
この記事ではshape属性の使用例をご紹介します。 shape属性は配列の形状(次元数と各次元のサイズ)を確認するのに役立ちます。 特に、行列計算では配列の形状が重要となるので、これを確認する方法はマ ...
配列の基本操作
# 配列の形状を取得・変更
print(arr.shape) # (5,) → 1次元配列
reshaped = arr.reshape((5, 1)) # 形状変更
# 転置
matrix = np.array([[1, 2, 3], [4, 5, 6]])
transposed = matrix.T # 転置行列
# データ型の取得・変更
print(arr.dtype) # int64(環境による)
float_arr = arr.astype(float) # 型をfloatに変更
複数の配列を結合するには np.concatenate()
を使用します。
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
concat_array = np.concatenate((a, b), axis=0) # 縦方向に結合
print(concat_array)
# 実行結果
# [[1 2]
# [3 4]
# [5 6]]
配列を等分割したい場合は np.split()
を使います。
arr = np.array([1, 2, 3, 4, 5, 6])
split_arrays = np.split(arr, 3) # 3つに分割
print(split_arrays)
# 実行結果
# [array([1, 2]), array([3, 4]), array([5, 6])]
配列の演算
基本的な演算方法を紹介します。
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
# 要素ごとの四則演算
print(a + b) # [5 7 9]
print(a - b) # [-3 -3 -3]
print(a * b) # [ 4 10 18]
print(a / b) # [0.25 0.4 0.5 ]
# スカラー演算
print(a * 2) # [2 4 6](全要素を2倍)
print(a + 10) # [11 12 13](全要素に10を加算)
# 要素ごとの累乗や余り計算
print(a ** 2) # [1 4 9](2乗)
print(b % 2) # [0 1 0](余り)
# 行列積(ドット積)
matrix1 = np.array([[1, 2], [3, 4]])
matrix2 = np.array([[5, 6], [7, 8]])
dot_product = np.dot(matrix1, matrix2) # [[19 22] [43 50]]
# @ 演算子でも同様の結果
print(A @ B)
# 合計、平均、最大・最小値
print(a.sum()) # 6
print(a.mean()) # 2.0
print(a.max()) # 3
print(a.min()) # 1
インデックス・スライス
NumPyでは、リストと同様にインデックス(index)やスライス(slice)を使って、配列の特定の要素や範囲を簡単に取得・変更できます。
また、NumPy独自の機能としてブールインデックスや高度なインデックスも利用できます。
1次元配列のインデックス
arr = np.array([10, 20, 30, 40, 50])
# インデックスアクセス
print(arr[0]) # 先頭の要素 → 10
print(arr[-1]) # 末尾の要素 → 50
Pythonのリストと同じように、0から始まるインデックスを使って要素を取得できます。
負のインデックスを使うと、後ろから要素を取得できます。
2次元配列のインデックス
arr2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print(arr2d[0, 1]) # 1行目・2列目の要素 → 2
print(arr2d[-1, -1]) # 最後の行・最後の列の要素 → 9
arr2d[row, column]
の形で要素を取得できます。
1次元配列のスライス
arr = np.array([10, 20, 30, 40, 50])
print(arr[1:4]) # インデックス1から3まで取得 → [20 30 40]
print(arr[:3]) # 先頭からインデックス2まで取得 → [10 20 30]
print(arr[2:]) # インデックス2から最後まで取得 → [30 40 50]
print(arr[::2]) # ステップ2(1つ飛ばし) → [10 30 50]
スライスの書き方: [開始:終了:ステップ]
開始
省略 → 先頭から取得終了
省略 → 最後まで取得ステップ
を指定すると、間引いて取得可能
2次元配列のスライス
arr2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print(arr2d[1:, 1:]) # 2行目以降&2列目以降
# [[5 6]
# [8 9]]
print(arr2d[:2, :2]) # 1行目・2行目の1列目・2列目
# [[1 2]
# [4 5]]
print(arr2d[:, 1]) # すべての行の2列目(列のスライス)
# [2 5 8]
:
を使うと、全ての行・列を選択できます。
行・列のスライスを組み合わせることで、部分的なデータを取得できます。
ブールインデックス(条件に合う要素を取得)
ブールインデックスを使うと、条件を満たす要素のみを抽出できます。
arr = np.array([10, 20, 30, 40, 50])
mask = arr > 25 # 条件を満たす要素を抽出
print(mask)
# [False False True True True]
print(arr[mask]) # [30 40 50]
arr > 25
は [False, False, True, True, True]
のブール配列を作成します。
arr[mask]
は True
の要素のみを抽出することを意味します。
インデックス応用編(リスト・配列で指定)
リストや配列を使って、複数の要素を指定して取得できます。
1次元配列のリストインデックス
arr = np.array([10, 20, 30, 40, 50])
indices = [0, 2, 4] # インデックスをリストで指定
print(arr[indices])
# [10 30 50]
指定した 複数のインデックスの要素を取得 できます。
2次元配列のリストインデックス
arr2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
rows = [0, 2] # 1行目と3行目を取得
cols = [1, 2] # 2列目と3列目を取得
print(arr2d[rows, cols])
# [2 9] → (0,1)と(2,2)の要素が取得される
arr2d[rows, cols]
は、(0,1) =(1行,2列)の要素と (2,2)=(3行,3列)の要素を取得します。
インデックスやスライスの変更
要素の取得だけでなく要素の変更も可能です。
arr = np.array([10, 20, 30, 40, 50])
arr[1:4] = 99 # スライス部分を変更
print(arr)
# [10 99 99 99 50]
スライスに単一の値を代入すると、全ての要素がその値に置き換わります。
NumPyでの統計・数学関数
arr = np.array([1, 2, 3, 4, 5])
# 統計量
print(np.mean(arr)) # 平均: 3.0
print(np.median(arr)) # 中央値: 3.0
print(np.std(arr)) # 標準偏差: 1.414
print(np.var(arr)) # 分散: 2.0
# その他の数学関数
print(np.exp(arr)) # 指数関数 e^x
print(np.log(arr)) # 自然対数
print(np.sqrt(arr)) # 平方根
print(np.sin(arr)) # 正弦
print(np.cos(arr)) # 余弦
標準偏差(std)や分散(var) はデータのばらつきを確認するのに便利です。
arr = np.array([1, 2, 3, 4, 5])
print(np.sum(arr)) # 15(合計)
print(np.cumsum(arr)) # [1 3 6 10 15](累積和)
print(np.prod(arr)) # 120(全要素の積)
print(np.cumprod(arr)) # [1 2 6 24 120](累積積)
累積和(cumsum)や累積積(cumprod) は、時系列データの分析でよく使われます。
NumPyの行列操作
A = np.array([[1, 2], [3, 4]])
# 行列の逆行列
A_inv = np.linalg.inv(A)
# 行列の行列式
det_A = np.linalg.det(A)
# 固有値・固有ベクトル
eigenvalues, eigenvectors = np.linalg.eig(A)
print(eig_values) # 固有値
print(eig_vectors) # 固有ベクトル
当然かもしれませんが、逆行列は正方行列(n×n)で、行列式がゼロでない場合のみ求めることができます。
行列式(det()
)は、行列が正則かどうかを判断するのに使われます。
固有値・固有ベクトル(eig()
)は、データ圧縮や主成分分析(PCA)などで活用されます。
NumPyの応用
NumPyは、データ分析、機械学習、シミュレーションなど、さまざまな分野で活用されています。
応用的な項目を以下で解説します。
ブロードキャスト
ブロードキャストとは、異なる形状(次元)の配列同士を自動的に調整し、要素ごとの演算を可能にするNumPyの機能です。
通常、行列の加算・乗算には同じ形状の配列が必要ですが、ブロードキャストにより異なる形状でも計算が行えます。
ブロードキャストの詳しい解説はこちらの記事を読んでみてください!
-
-
【Python】NumPy配列のブロードキャストとは?ルールを解説!
2025/2/18
NumPyのブロードキャストは、異なる形状(shape)の配列同士の演算を可能にする便利な機能です。 この記事ではブロードキャストがどのように適用されるか、そのルールを具体例とともにご紹介します。 ぜ ...
配列とスカラーの演算
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr + 10)
# 実行結果
# [[11 12 13]
# [14 15 16]]
異なる次元の配列の演算
a = np.array([[1, 2, 3], [4, 5, 6]]) # (2,3)の行列
b = np.array([[10], [20]]) # (2,1)の列ベクトル
print(a + b)
# 実行結果
# [[11 12 13]
# [24 25 26]]
b
の 10
と 20
が自動的に拡張され、a
と演算が行われます。
ベクトル化(Vectorization)
NumPyでは、ループを使わずに配列全体を処理できるため、高速な演算が可能です。
ループを使った計算(遅い)
data = [1, 2, 3, 4, 5]
result = [x * 2 for x in data]
print(result)
# 実行結果
# [2, 4, 6, 8, 10]
NumPyを使った計算(高速)
arr = np.array([1, 2, 3, 4, 5])
result = arr * 2
print(result)
# 実行結果
# [2 4 6 8 10]
ループを使わずに、一括で計算できます。
ソート・検索
NumPyは、大量のデータを高速にソートや検索できます。
ソート
arr = np.array([3, 1, 4, 1, 5, 9])
sorted_arr = np.sort(arr)
print(sorted_arr)
# 実行結果
# [1 1 3 4 5 9]
検索(条件を満たす要素のインデックスを取得)
arr = np.array([10, 20, 30, 40, 50])
indices = np.where(arr > 25)
print(indices)
# 実行結果
# (array([2, 3, 4]),) → 30, 40, 50 のインデックス
where()
を使うと、条件を満たす要素の位置を取得できます。
擬似乱数の生成
NumPyには乱数を生成する機能があり、シミュレーションや統計分析によく使われています。
乱数の例
np.random.seed(42) # シードを固定(再現性の確保)
rand_nums = np.random.rand(5) # 0〜1 の一様乱数
print(rand_nums)
normal_nums = np.random.randn(5) # 標準正規分布(平均0, 分散1)
print(normal_nums)
int_nums = np.random.randint(1, 10, size=(3, 3)) # 1〜9の整数乱数(3×3行列)
print(int_nums)
random.rand()
は 0〜1 の一様乱数を生成。random.randn()
は正規分布に従う乱数を生成。random.randint()
は指定範囲の整数をランダムに生成。
ファイルの入出力
NumPyでは、CSVやバイナリ形式でデータを保存・読み込みできます。
CSVの保存・読み込み
arr = np.array([[1, 2, 3], [4, 5, 6]])
# CSVとして保存
np.savetxt("data.csv", arr, delimiter=",", fmt="%d")
# CSVを読み込み
loaded_arr = np.loadtxt("data.csv", delimiter=",")
print(loaded_arr)
savetxt()
でCSVとして保存し、loadtxt()
で再度読み込めます。
バイナリファイル(.npy形式)
np.save("data.npy", arr) # バイナリ形式で保存
loaded_arr = np.load("data.npy") # 読み込み
print(loaded_arr)
.npy
形式は、CSVより高速に読み書きできるため、大量のデータを扱う場合に便利です。
画像処理(NumPy + OpenCV)
NumPyを使うと、画像データを数値配列として扱えます。
画像の読み込みと処理
import cv2
# 画像をNumPy配列として読み込む
img = cv2.imread("sample.jpg", cv2.IMREAD_GRAYSCALE) # グレースケール変換
print(img.shape) # 画像のサイズを確認
# 画像を反転
inverted_img = 255 - img
# 画像を保存
cv2.imwrite("inverted_sample.jpg", inverted_img)
OpenCVと組み合わせることで、画像の処理や変換が可能になります。
機械学習との連携(Scikit-learn, TensorFlow)
NumPyは機械学習ライブラリ(Scikit-learn, TensorFlow, PyTorch)と相性が良く、データの前処理に使われます。
標準化(データの正規化)
from sklearn.preprocessing import StandardScaler
data = np.array([[1, 2], [3, 4], [5, 6]])
scaler = StandardScaler()
normalized_data = scaler.fit_transform(data) # 正規化
print(normalized_data)
StandardScaler
は平均0、分散1にデータを正規化します。
まとめ
最後まで読んでいただきありがとうございます。
NumPyを使うと、数値計算やデータ処理が効率化できます。
Python初心者でも基本的な操作を覚えておけば、データ分析や機械学習の基礎を築くことができます。
ぜひこの記事を備忘録として活用してみてください!
Python初心者におすすめの学習サービス
オンラインPython学習サービス「PyQ™(パイキュー)」:プログラミング初心者に優しいオンラインPython学習サービス。プログラミングを始めたけど、何かを作れるレベルには至っていない人におすすめ。実用的なPythonコードを実装することができる。