クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

行列で回転と拡大縮小

このレッスンのあとで: 2行2列の行列を、回転、拡大縮小、反転のどれかとして読むことができる。

55分のレッスンコマンド3件JupyterLab データサイエンスラボ:pandas、Matplotlib、scikit-learn をブラウザーで

行列は点を動かす装置である

行列は、平面の点を別の点へ動かす変換として読めます。拡大、縮小、反転、回転は、どれも小さな行列の掛け算です。

写真アプリで画像を回したり広げたりするとき、画面のすべての点に、同じ行列が掛けられています。

このレッスンのゴール

メモ

2行2列の行列を、回転、拡大縮小、反転のどれかとして読むことができる。

キーワード

ことばいみ
変換点を別の点へ動かす決まり
拡大縮小各方向の長さを何倍かにする変換
反転軸をはさんで、点を反対側に映す変換
回転原点を中心に、点を角度だけ回す変換
合成変換を続けて行うこと。行列の積になる

学生が入力するセルは、このプレビューでは空白です。

2行2列の行列は点を動かす

点 [x, y] に2行2列の行列を掛けると、新しい点が得られます。行列の1列目は、点 [1, 0] の行き先で、2列目は、点 [0, 1] の行き先です。

この2つの行き先が決まると、ほかの点の行き先も、すべて決まります。

例: 点 [3, 1] を動かす

変換行列[3, 1] の行き先
縦横2倍[[2, 0], [0, 2]][6, 2]
横だけ3倍[[3, 0], [0, 1]][9, 1]
上下反転[[1, 0], [0, -1]][3, -1]
90度回転[[0, -1], [1, 0]][-1, 3]

学生が入力するセルは、このプレビューでは空白です。

3つの点を拡大する

コード: python
# 横に2倍、縦に3倍にする行列を、3つの点に掛けます。
matrix = [[2, 0], [0, 3]]
corners = [[1, 1], [2, 0], [0, 4]]

for p in corners:
    x = matrix[0][0] * p[0] + matrix[0][1] * p[1]
    y = matrix[1][0] * p[0] + matrix[1][1] * p[1]
    print(p, "->", [x, y])
# matrix の 3 を -3 に変えると、点はどう動きますか。

NumPy で90度回転する

コマンド
docker exec jupyter python3 -c "import numpy as np; r = np.array([[0, -1], [1, 0]]); p = np.array([3, 1]); print(r @ p)"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

回転の行列は角度から作る

角度を θ とすると、回転の行列は [[cos θ, -sin θ], [sin θ, cos θ]] です。cos と sin は、角度から決まる2つの数です。

0度なら何も動かず、90度なら点 [1, 0] は [0, 1] へ、180度なら原点の反対側へ動きます。長さは変わりません。

例: 角度と回転の行列

角度cos と sin行列
0度1 と 0[[1, 0], [0, 1]]
90度0 と 1[[0, -1], [1, 0]]
180度-1 と 0[[-1, 0], [0, -1]]
45度約 0.71 と約 0.71[[0.71, -0.71], [0.71, 0.71]]

学生が入力するセルは、このプレビューでは空白です。

角度から回転の行列を作る

コマンド
docker exec jupyter python3 -c "import numpy as np; t = np.radians(90); r = np.array([[np.cos(t), -np.sin(t)], [np.sin(t), np.cos(t)]]); print(np.round(r @ np.array([3, 1]), 6))"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

角度から点を回す

コード: python
import math

# 角度から、回転の行列の4つの数を作ります。
angle = math.radians(90)
c = math.cos(angle)
s = math.sin(angle)

point = [3, 1]
x = c * point[0] - s * point[1]
y = s * point[0] + c * point[1]

print("回転した点:", round(x, 6), round(y, 6))
# 90 を 180 に変えて、点がどこに行くか予想してから実行してください。

変換を続けると行列の積になる

回転してから横に3倍にする、という2つの変換を続けると、1つの行列にまとめられます。先に行う変換の行列は、右側に書きます。

順番を入れ替えると、結果が変わります。行列の積で、AB と BA が違うのと同じ理由です。

例: 順番で行き先が変わる

順番合成の行列[3, 1] の行き先
回転してから横3倍[[0, -3], [1, 0]][-3, 3]
横3倍してから回転[[0, -1], [3, 0]][-1, 9]

学生が入力するセルは、このプレビューでは空白です。

よくある間違い

注意

多くの人は、先に行う変換を、左に書きます。行列では、最初の変換が、点に近い右側に来ます。「回転してから拡大」は、拡大の行列に回転の行列を右から掛けたものです。

合成の行列を確かめる

コマンド
docker exec jupyter python3 -c "import numpy as np; s = np.array([[3, 0], [0, 1]]); r = np.array([[0, -1], [1, 0]]); print(s @ r); print(r @ s)"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

さらに挑戦: 元に戻す回転

90度の回転を4回続けると、点は元の場所に戻ります。つまり、4回分の積は、単位行列です。

30度回してから、-30度回すと、どうなるでしょうか。ノートブックで、2つの積を求めて、予想と比べましょう。

このラボとソースについて: JupyterLab データサイエンスラボ:pandas、Matplotlib、scikit-learn をブラウザーで

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。