この記事では、土木工学を学ぶ学生を対象に、Pythonの数値計算ライブラリ NumPy の基本を解説します。
この記事では、
- NumPyと
ndarray - 配列の基本操作
- ブロードキャスト
- ベクトル・行列
- 連立方程式
- NumPyとpandas・Matplotlibの関係
- 生成AIを使ったNumPy学習
について扱います。
この記事を読む前に
- 本記事は筆者個人の学習記録であり、所属する大学や特定の団体の公式見解ではありません。
- 本記事の内容には十分注意を払っていますが、正確性や完全性を保証するものではありません。
- 本記事を参考にする場合は、必ずご自身でも最新の公式情報等をご確認ください。
- 本記事の利用によって生じたいかなる損害についても、筆者は責任を負いかねます。
今回のサンプルコードはGitHubにも公開しています。
また、Google Colabからコードを実行することもできます。
0. はじめに
前回は、Pythonでグラフを作成するための Matplotlib について学びました。
前回の記事はこちら
Matplotlibを使うと、河川水位や雨量、交通量などのデータをグラフとして可視化できます。
一方、土木工学ではグラフを作るだけでなく、
- 行列計算
- 連立方程式
- 座標計算
- 数値微分・数値積分
- 構造解析
- 水理計算
- シミュレーション
など、大量の数値を扱うこともあります。
そこで登場するのが NumPy です。
NumPyは、Pythonで数値計算を行うための代表的なライブラリです。
今回は細かい関数を暗記するのではなく、
NumPyを使うと何ができるのか
を理解することを目標にします。
1. NumPyとは
NumPyは、Pythonで配列を使った数値計算を行うためのライブラリです。
一般的には、
import numpy as np
として利用します。
NumPyの中心となるのが ndarray という多次元配列です。
例えば河川水位を、
water_level = np.array([1.2, 1.5, 1.4, 2.1, 2.8])
のように表現できます。
print(type(water_level))
<class 'numpy.ndarray'>
このように、np.array() で作った配列は ndarray です。
2. NumPyは土木で何に使う?
NumPyは土木専用のライブラリではありませんが、土木工学で扱う数値データと相性がよいライブラリです。
例えば、
| 分野 | 利用例 |
|---|---|
| 構造 | 荷重・変位データ、剛性行列、連立方程式 |
| 水理 | 水位・流量、数値積分、数値微分 |
| 地盤 | 地盤データ、パラメータ計算 |
| 交通 | 交通量、時系列データ、シミュレーション |
| 測量・GIS | 座標、距離、標高データ |
などに利用できます。
つまりNumPyは、
土木工学で扱う数値を計算するための基盤
として利用できます。
3. PythonのリストとNumPy配列
Pythonにはもともとリストがあります。
a = [1, 2, 3]
b = [4, 5, 6]
print(a + b)
結果は、
[1, 2, 3, 4, 5, 6]
です。
これは数値の足し算ではなく、リストの連結です。
一方、NumPyでは、
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(a + b)
[5 7 9]
となります。
NumPyでは、配列の要素に対する計算をまとめて行えます。
例えば、
data = np.array([1, 2, 3, 4, 5])
print(data + 10)
print(data * 2)
print(data / 2)
[11 12 13 14 15]
[ 2 4 6 8 10]
[0.5 1. 1.5 2. 2.5]
このような配列演算がNumPyの基本です。
4. 土木データを計算する
河川水位を例にしてみます。
water_level = np.array([
1.2,
1.5,
1.4,
2.1,
2.8
])
すべての水位に0.3 mを加える場合、
corrected_level = water_level + 0.3
print(corrected_level)
と書けます。
NumPyでは、このように配列全体へ一度に計算を適用できます。
最大値・最小値・平均値も簡単に求められます。
print("最大水位:", np.max(water_level))
print("最小水位:", np.min(water_level))
print("平均水位:", np.mean(water_level))
観測データの処理では、このような計算が頻繁に登場します。
5. ブロードキャスト
先ほど、
water_level + 0.3
という計算を行いました。
配列と1つの数値を計算できたのは、NumPyの ブロードキャスト(broadcasting) という仕組みによるものです。
例えば、
data = np.array([1, 2, 3])
print(data + 10)
[11 12 13]
となります。
イメージとしては、
[1, 2, 3] + [10, 10, 10]
のように考えると分かりやすいでしょう。
ただし、どのような形の配列でも計算できるわけではありません。
NumPyでは、
配列の値だけでなく、配列の形(shape)も意識する
ことが重要です。
6. 配列の形を確認する
NumPyでは、配列の構造を確認するために、
shapendimsizedtype
などを利用します。
data = np.array([1, 2, 3, 4, 5])
print(data.shape)
print(data.ndim)
print(data.size)
print(data.dtype)
それぞれ、
| 属性 | 意味 |
|---|---|
shape |
各次元の大きさ |
ndim |
次元数 |
size |
要素数 |
dtype |
データ型 |
を表します。
例えば、
(5,)
1
5
int64
のようになります。
dtype は環境や作成方法によって異なる場合があります。
7. 2次元配列と行列
NumPyでは2次元以上の配列も扱えます。
data = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
print(data)
print(data.shape)
[[1 2 3]
[4 5 6]
[7 8 9]]
(3, 3)
(3, 3) は3行3列を意味します。
このような2次元配列は、数学で扱う行列を表現するためにも利用できます。
例えば、
$$
A=
\begin{pmatrix}
1 & 2\\
3 & 4
\end{pmatrix}
$$
は、
A = np.array([
[1, 2],
[3, 4]
])
と表せます。
np.matrix は使わない
古いPython・NumPyの資料では np.matrix が使われていることがあります。
しかし、現在のNumPyでは新しいコードに np.matrix を使用することは推奨されていません。
このシリーズでは、
np.array(...)
による2次元 ndarray を基本とします。
8. * と @ の違い
行列計算では、* と @ の違いに注意しましょう。
A = np.array([
[1, 2],
[3, 4]
])
B = np.array([
[5, 6],
[7, 8]
])
* は要素ごとの掛け算です。
A * B
[[ 5 12]
[21 32]]
一方、数学でいう行列積には @ を使います。
A @ B
[[19 22]
[43 50]]
つまり、
A * B
→ 要素ごとの積
A @ B
→ 行列積
です。
行列計算では、この違いを必ず覚えておきましょう。
9. 連立方程式を解く
土木工学では、行列を使った連立方程式が頻繁に登場します。
例えば、
$$
\begin{aligned}
2x+y&=5
x+3y&=6
\end{aligned}
$$
を考えます。
行列形式では、
$$\begin{pmatrix}2&1\\1&3\end{pmatrix}\begin{pmatrix}x\\y\end{pmatrix}=\begin{pmatrix}5\\6\end{pmatrix}$$
となります。
NumPyでは、
A = np.array([
[2, 1],
[1, 3]
])
b = np.array([5, 6])
x = np.linalg.solve(A, b)
print(x)
[1.8 1.4]
となります。
したがって、
$$
x=1.8,\qquad y=1.4
$$
です。
np.linalg.solve() の注意点
np.linalg.solve() は、どんな連立方程式でも解けるわけではありません。
基本的には、係数行列 A が正方行列かつフルランクである必要があります。
そのため、
「連立方程式だからとりあえず
np.linalg.solve()」
ではなく、まず数学的にどのような問題なのかを確認することが重要です。
例えば最小二乗法を行う場合には、np.linalg.lstsq() など別の方法を検討します。
10. NumPyのビューとコピー
NumPyでは、配列の一部を取り出したときの扱いにも注意が必要です。
data = np.array([10, 20, 30, 40, 50])
part = data[1:4]
print(part)
[20 30 40]
ここで、
part[0] = 999
とすると、
print(data)
[ 10 999 30 40 50]
となります。
これは、基本的なスライスによって得られた part が元の配列のビューになっているためです。
元の配列とは独立したデータとして扱いたい場合は、
part = data[1:4].copy()
とします。
NumPyを使うときは、
この配列は元のデータを共有しているのか?
という点を意識しておくと、意図しないデータ変更を防げます。
11. NumPyとpandas・Matplotlib
ここまで学んできたpandasやMatplotlibとNumPyは、組み合わせて使うことができます。
大まかには、
| ライブラリ | 主な役割 |
|---|---|
| NumPy | 数値配列・数値計算 |
| pandas | 表形式データの整理・分析 |
| Matplotlib | データの可視化 |
という関係です。
例えば、
CSV
↓
pandasで読み込む
↓
NumPyで計算
↓
Matplotlibで可視化
という流れでデータを処理できます。
12. NumPyとMatplotlibを組み合わせる
例えば、NumPyで $y=x^2$ を計算してMatplotlibで表示してみます。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 10, 100)
y = x ** 2
plt.plot(x, y)
plt.xlabel("x")
plt.ylabel("y")
plt.title("y = x²")
plt.grid()
plt.show()
ここでは、
np.linspace(0, 10, 100)
によって、0から10までの範囲を100個の点に分けています。
その x を使って、
$$
y=x^2
$$
を計算しています。
このように、
NumPy
↓
計算
↓
Matplotlib
↓
可視化
という組み合わせは、Pythonによるデータ分析でよく使われます。
13. NumPyの関数は全部覚える必要がある?
NumPyには非常に多くの関数があります。
例えば、
np.array()
np.zeros()
np.ones()
np.arange()
np.linspace()
np.mean()
np.max()
np.min()
np.sum()
np.sqrt()
np.exp()
np.log()
np.reshape()
np.concatenate()
np.linalg.solve()
などです。
しかし、これらをすべて暗記する必要はありません。
重要なのは、
何を計算したいか
↓
どのような数学的処理か
↓
どの機能を使えばよいか調べる
↓
コードを書く
↓
結果を確認する
という流れを身につけることです。
例えば、
「連立一次方程式を解きたい」
という問題に対して、
np.linalg.solve()
という関数があることを知っていれば、必要になったときに使い方を調べられます。
公式ドキュメントや検索、生成AIを利用して調べることも有効です。
14. 生成AIとNumPy
2026年現在、生成AIはPython学習やコード作成の補助として利用できます。
例えば、
NumPyを使って、河川水位の配列から
最大値、最小値、平均値を計算するコードを書いてください。
と指示すれば、コードの例を得られます。
ただし、
AIがコードを書けることと、そのコードが正しいことは別問題です。
特に土木工学では、
- 配列の形
- 数式
- 単位
- 前提条件
- 計算方法
- 結果の妥当性
を確認する必要があります。
例えば、コードが正常に実行できても、
m と mm
m³/s と L/s
度 と ラジアン
などを間違えていれば、結果は意味を持ちません。
そのため、
AIにコードを書かせる
↓
コードを読む
↓
実行する
↓
数式・単位・shapeを確認する
↓
結果の妥当性を確認する
という使い方を意識しましょう。
土木工学では、
「コードが動く」ことより「計算結果が工学的に正しい」ことが重要
です。
15. 今回学んだこと
今回はNumPyの基本を学びました。
重要なポイントは次の通りです。
- NumPyはPythonの代表的な数値計算ライブラリ
-
ndarrayがNumPyの基本的な配列 - 配列に対してまとめて計算できる
- ブロードキャストによって配列と単一の値などを計算できる
-
shapeで配列の形を確認できる -
ndimで次元数を確認できる - 2次元
ndarrayで行列を表現できる -
*は要素ごとの積、@は行列積 -
np.linalg.solve()で連立一次方程式を解ける - NumPyのスライスではビューが返る場合がある
- 必要に応じて
.copy()を使う - pandasやMatplotlibと組み合わせて利用できる
- NumPyの関数をすべて暗記する必要はない
- 生成AIをコード作成の補助として利用できる
- AIが生成したコードや結果を検証することが重要
16. 次回以降について
ここまでで、
Python
↓
pandas
↓
Matplotlib
↓
NumPy
というPythonによるデータ処理・可視化・数値計算の基本的な道具を学びました。
これらを組み合わせると、
データを読み込む
↓
pandasで整理する
↓
NumPyで計算する
↓
Matplotlibで可視化する
↓
結果を考察する
という流れでデータを扱えるようになります。
例えば河川データなら、
雨量データ
↓
pandasで読み込む
↓
NumPyで計算
↓
Matplotlibで可視化
↓
雨量と水位の関係を考察
という処理ができます。
さらにPythonを土木工学へ応用すると、
- SciPy
- 統計解析
- 回帰分析
- GIS
- 機械学習
- 深層学習
- 数値解析
- 有限要素法
- PINN(Physics-Informed Neural Networks)
などにもつながっていきます。
Pythonそのものを目的にするのではなく、
土木工学の問題を理解し、Pythonを道具として使って解決する
ことを意識して学んでいきましょう。
まとめ
NumPyは、Pythonで数値計算や配列・行列を扱うための基本的なライブラリです。
最初からすべての関数を暗記する必要はありません。
まずは、
ndarray
shape
broadcasting
ベクトル・行列
@
np.linalg.solve()
といった基本的な考え方を理解しましょう。
そして、必要な機能を公式ドキュメントや検索、生成AIなどから調べて使えるようになることが重要です。
ただし、生成AIを利用する場合も、コードをそのまま信じるのではなく、
- 何を計算しているのか
- 数学的に正しいのか
- 配列の形は適切か
- 単位は正しいか
- 結果は工学的に妥当か
を確認する習慣を身につけましょう。
Pythonを使って、土木工学の問題を自分で考え、計算し、結果を検証できるようになること。
これを目標にしていきましょう。
第6回の記事は下のリンクから