このページのリンクには広告が含まれています。 プログラミング

【Python】初心者必見!NumPyの基本とよく使う処理まとめ

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_1Darr_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]]

b1020 が自動的に拡張され、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コードを実装することができる。

  • この記事を書いた人
  • 最新記事

-プログラミング