「Pythonで数値計算をしたいけど、どの関数を使えばいいの?」
「データ分析でよく使うNumPyの機能を知りたい」
「配列操作や統計計算を効率的に行いたい」
そんなあなたにおすすめなのがNumPy(ナムパイ)です。
Pythonの数値計算ライブラリであるNumPyは、配列操作や数学関数、線形代数、乱数生成など、科学技術計算やデータ分析に欠かせない機能を豊富に提供しています。
この記事では、NumPyの主要な関数をカテゴリ別に分けて、初心者にも分かりやすく実例付きでご紹介します。
NumPyとは?

簡単に言うと
NumPyは、Pythonで数値計算を高速に行うためのライブラリです。
特に**配列(array)**という仕組みを使って、大量のデータを一度に効率的に処理できます。
NumPyの特徴
特徴 | 説明 | メリット |
---|---|---|
高速処理 | C言語で実装されている | 通常のPythonより10-100倍高速 |
豊富な関数 | 数学・統計・線形代数など | 複雑な計算も簡単に |
メモリ効率 | 効率的なメモリ使用 | 大量データも扱える |
他ライブラリとの連携 | pandas、matplotlib等 | データ分析の基盤 |
インストール方法
pip install numpy
基本的な使い方
import numpy as np # 一般的にnpという名前で使います
# 配列の作成
arr = np.array([1, 2, 3, 4, 5])
print(arr) # [1 2 3 4 5]
配列の生成と操作
基本的な配列作成
関数 | 使い方 | 例 | 結果 |
---|---|---|---|
np.array() | リストから配列作成 | np.array([1, 2, 3]) | [1 2 3] |
np.arange() | 等差数列の作成 | np.arange(0, 10, 2) | [0 2 4 6 8] |
np.linspace() | 等間隔で分割 | np.linspace(0, 1, 5) | [0. 0.25 0.5 0.75 1.] |
特殊な配列の作成
# 全要素が0の配列
zeros = np.zeros(5) # [0. 0. 0. 0. 0.]
# 全要素が1の配列
ones = np.ones((3, 3)) # 3×3の1で埋められた配列
# 単位行列(対角線が1、他が0)
identity = np.eye(3) # 3×3の単位行列
配列の形状変更
# 元の配列
arr = np.array([1, 2, 3, 4, 5, 6])
# 形状変更(2×3の行列に)
reshaped = np.reshape(arr, (2, 3))
# [[1 2 3]
# [4 5 6]]
# 1次元に変換
flattened = reshaped.flatten() # [1 2 3 4 5 6]
# 転置(行と列を入れ替え)
transposed = reshaped.transpose()
# [[1 4]
# [2 5]
# [3 6]]
配列の結合と繰り返し
# 配列の結合
a = np.array([1, 2])
b = np.array([3, 4])
combined = np.concatenate((a, b)) # [1 2 3 4]
# 配列の繰り返し
repeated = np.tile(a, 3) # [1 2 1 2 1 2]
基本的な数学関数

四則演算
a = np.array([1, 2, 3, 4])
b = np.array([5, 6, 7, 8])
# 要素ごとの計算
add_result = np.add(a, b) # [ 6 8 10 12] 加算
sub_result = np.subtract(b, a) # [4 4 4 4] 減算
mul_result = np.multiply(a, b) # [ 5 12 21 32] 乗算
div_result = np.divide(b, a) # [5. 3. 2.33 2.] 除算
# より簡単な書き方
add_result = a + b # 上記と同じ結果
累乗と根
x = np.array([1, 4, 9, 16])
# 累乗
powered = np.power(x, 2) # [ 1 16 81 256]
# 平方根
sqrt_result = np.sqrt(x) # [1. 2. 3. 4.]
指数・対数関数
x = np.array([1, 2, 3])
# 指数関数(e^x)
exp_result = np.exp(x) # [ 2.718 7.389 20.086]
# 自然対数
log_result = np.log(x) # [0. 0.693 1.099]
# 常用対数(底10)
log10_result = np.log10([10, 100, 1000]) # [1. 2. 3.]
その他の便利な関数
x = np.array([-3, -1, 0, 2, 5])
# 絶対値
abs_result = np.abs(x) # [3 1 0 2 5]
# 符号(正:1, 負:-1, 0:0)
sign_result = np.sign(x) # [-1 -1 0 1 1]
三角関数と角度変換
基本的な三角関数
# 角度(ラジアン)
angles = np.array([0, np.pi/4, np.pi/2, np.pi])
# 三角関数
sin_values = np.sin(angles) # [0. 0.707 1. 0. ]
cos_values = np.cos(angles) # [1. 0.707 0. -1. ]
tan_values = np.tan(angles) # [0. 1. inf 0. ]
逆三角関数
# 値から角度を求める
values = np.array([0, 0.5, 1])
arcsin_result = np.arcsin(values) # [0. 0.524 1.571] ラジアン
arccos_result = np.arccos(values) # [1.571 1.047 0. ] ラジアン
角度変換
# 度をラジアンに変換
degrees = np.array([0, 30, 45, 90, 180])
radians = np.deg2rad(degrees) # [0. 0.524 0.785 1.571 3.142]
# ラジアンを度に変換
degrees_back = np.rad2deg(radians) # [0. 30. 45. 90. 180.]
統計関数
基本統計量
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# 平均値
mean_val = np.mean(data) # 5.5
# 中央値
median_val = np.median(data) # 5.5
# 標準偏差
std_val = np.std(data) # 2.87
# 分散
var_val = np.var(data) # 8.25
# 最小値・最大値
min_val = np.min(data) # 1
max_val = np.max(data) # 10
パーセンタイル
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# 25%, 50%, 75%パーセンタイル
percentiles = np.percentile(data, [25, 50, 75])
print(percentiles) # [3.25 5.5 7.75]
ヒストグラム
# データの分布を調べる
data = np.random.normal(0, 1, 1000) # 正規分布の乱数
hist, bins = np.histogram(data, bins=10)
print(f"ヒストグラム: {hist}")
print(f"区間: {bins}")
条件処理と検索

条件による要素選択
data = np.array([1, -2, 3, -4, 5])
# 条件に基づく選択
# 正の数なら元の値、負の数なら0
result = np.where(data > 0, data, 0)
print(result) # [1 0 3 0 5]
# より複雑な条件
# 3より大きければ'大'、そうでなければ'小'
labels = np.where(data > 3, '大', '小')
print(labels) # ['小' '小' '小' '小' '大']
配列の検索と処理
data = np.array([1, 0, 3, 0, 5, 3, 7])
# 0以外の要素のインデックス
nonzero_indices = np.nonzero(data)
print(nonzero_indices[0]) # [0 2 4 5 6]
# 重複を除いた要素
unique_values = np.unique(data)
print(unique_values) # [0 1 3 5 7]
# ソート
sorted_data = np.sort(data) # [0 0 1 3 3 5 7]
sort_indices = np.argsort(data) # [1 3 0 2 5 4 6]
乱数生成
基本的な乱数
# シードを設定(再現可能な乱数)
np.random.seed(42)
# 0以上1未満の一様分布
uniform = np.random.rand(5) # [0.374 0.951 0.732 0.598 0.156]
# 標準正規分布(平均0、標準偏差1)
normal = np.random.randn(5) # [-0.847 0.767 -1.104 1.494 -0.205]
# 指定範囲の整数
integers = np.random.randint(1, 10, size=5) # [6 3 7 4 6]
より実用的な乱数
# 選択肢からランダムに選択
choices = np.array(['りんご', 'バナナ', 'オレンジ'])
selected = np.random.choice(choices, size=3)
print(selected) # ['バナナ' 'りんご' 'バナナ']
# カスタム分布
# 平均50、標準偏差10の正規分布
custom_normal = np.random.normal(50, 10, size=1000)
線形代数
基本的な行列演算
# 行列の定義
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# ドット積(内積)
dot_product = np.dot(A, B)
# [[19 22]
# [43 50]]
# 行列積(matmulも同じ結果)
matrix_product = np.matmul(A, B) # dot()と同じ結果
高度な線形代数
# 正方行列の例
matrix = np.array([[4, 2], [1, 3]])
# 逆行列
inverse = np.linalg.inv(matrix)
print(inverse)
# 行列式
determinant = np.linalg.det(matrix)
print(f"行列式: {determinant}") # 10.0
# 固有値と固有ベクトル
eigenvalues, eigenvectors = np.linalg.eig(matrix)
print(f"固有値: {eigenvalues}")
連立方程式の解
# 連立方程式 Ax = b を解く
# 例: 2x + 3y = 7, x + 4y = 8
A = np.array([[2, 3], [1, 4]])
b = np.array([7, 8])
# 解を求める
solution = np.linalg.solve(A, b)
print(f"解: x={solution[0]}, y={solution[1]}") # x=1.0, y=1.667
その他の便利な関数
値の制限と累積計算
data = np.array([1, 5, 3, 8, 2, 9, 4])
# 値を指定範囲に制限
clipped = np.clip(data, 3, 7) # [3 5 3 7 3 7 4]
# 累積和
cumsum = np.cumsum(data) # [ 1 6 9 17 19 28 32]
# 累積積
cumprod = np.cumprod([1, 2, 3, 4]) # [ 1 2 6 24]
# 隣接要素の差分
differences = np.diff(data) # [ 4 -2 5 -6 7 -5]
要素の繰り返し
# 各要素を指定回数繰り返し
original = np.array([1, 2, 3])
repeated = np.repeat(original, 3) # [1 1 1 2 2 2 3 3 3]
# 配列全体を繰り返し
tiled = np.tile(original, 2) # [1 2 3 1 2 3]
実践的な使用例

データ分析の例
# 売上データの分析
sales_data = np.array([120, 150, 180, 200, 175, 190, 210, 185, 195, 220])
print(f"平均売上: {np.mean(sales_data):.1f}")
print(f"売上の標準偏差: {np.std(sales_data):.1f}")
print(f"最高売上: {np.max(sales_data)}")
print(f"最低売上: {np.min(sales_data)}")
# 平均より高い売上の日数
above_average = np.sum(sales_data > np.mean(sales_data))
print(f"平均より高い売上の日数: {above_average}日")
科学計算の例
# 物理シミュレーション:放物線運動
t = np.linspace(0, 2, 100) # 時間(0-2秒)
v0 = 20 # 初速度(m/s)
g = 9.8 # 重力加速度(m/s²)
# 高さの計算
h = v0 * t - 0.5 * g * t**2
# 最高点の時刻と高さ
max_height_time = t[np.argmax(h)]
max_height = np.max(h)
print(f"最高点に達する時刻: {max_height_time:.2f}秒")
print(f"最高点の高さ: {max_height:.2f}m")
よくある使い方のパターン
パターン1:データの前処理
# 欠損値を含むデータの処理
data = np.array([1.0, 2.0, np.nan, 4.0, 5.0])
# NaNを平均値で置換
mean_without_nan = np.nanmean(data) # NaNを除いた平均
data_filled = np.where(np.isnan(data), mean_without_nan, data)
パターン2:条件に基づくフィルタリング
# 成績データのフィルタリング
scores = np.array([85, 92, 78, 96, 88, 73, 91])
# 80点以上の成績のみ取得
high_scores = scores[scores >= 80]
print(high_scores) # [85 92 96 88 91]
# 条件を満たす要素の個数
num_high_scores = np.sum(scores >= 80)
print(f"80点以上の人数: {num_high_scores}人")
パターン3:配列の変形と結合
# 複数の実験データを結合
experiment1 = np.array([1.2, 1.5, 1.3])
experiment2 = np.array([1.4, 1.6, 1.2])
experiment3 = np.array([1.3, 1.4, 1.5])
# 縦方向に結合(各実験が行になる)
all_experiments = np.vstack([experiment1, experiment2, experiment3])
print(all_experiments)
# [[1.2 1.5 1.3]
# [1.4 1.6 1.2]
# [1.3 1.4 1.5]]
# 各測定点の平均
averages = np.mean(all_experiments, axis=0)
print(f"各測定点の平均: {averages}")
まとめ:NumPyで効率的な数値計算を
重要なポイント
- NumPyは数値計算の基盤:データ分析や科学計算に必須
- 豊富な関数群:配列操作、統計、線形代数など幅広くカバー
- 高速処理:大量データも効率的に処理可能
- 他ライブラリとの連携:pandas、matplotlib等の基盤として重要
学習の順番
- 基本的な配列操作:np.array, reshape, transpose
- 数学関数:四則演算、統計関数
- 条件処理:np.where, フィルタリング
- 線形代数:行列演算、連立方程式
- 実践的な応用:データ分析、科学計算
よく使う関数トップ10
順位 | 関数 | 用途 |
---|---|---|
1 | np.array() | 配列作成 |
2 | np.mean() | 平均値計算 |
3 | np.sum() | 合計値計算 |
4 | np.where() | 条件分岐 |
5 | np.arange() | 連続値配列作成 |
6 | np.reshape() | 配列形状変更 |
7 | np.max() / np.min() | 最大・最小値 |
8 | np.std() | 標準偏差 |
9 | np.random.rand() | 乱数生成 |
10 | np.dot() | 行列積・内積 |
コメント