LoginSignup
0
0

マンハッタン距離・ユークリッド距離

Last updated at Posted at 2024-05-16

本日覚えたこと -マンハッタン距離・ユークリッド距離-

Pythonの練習のため、AtCoderやPaizaなどでちまちまとアルゴリズムの勉強中です。
で、問題にマンハッタン距離についての問題がありました。
というか、そもそも

マンハッタン距離ってなんだったっけ?ユークリッドは聞いたことあるような……?

用語がわからない超初心者の私。
ちょっと恥ずかしいと思いつつも人間だれしも最初は初心者!と開き直って調べてみました。

説明

点Xから点Yまでの距離のこと。
マンハッタンは直角に曲がりつつ移動した距離のこと。(ピンク)
ユークリッドは直線距離。(水色)
うむ。なるほど。なんか記憶の底から、うっすらと思い出が。中学生くらい?
ウン十年前過ぎて、もう忘却の彼方です。
ユークリッドはたしかギリシャ人。ではマンハッタンはアメリカ人?とか考えつつ。
image.png
x = [0,0] y = [2,2]
としたら
マンハッタン距離 → |0 – 2|+|0 – 2| = 4
ユークリッド距離 → $\sqrt{2^2 + 2^2}$ = $\sqrt{8}$
ということですな!

コードにすることを考える

図にして、数式にしたらわかった……が。コードにするのはどうやるのじゃ?

  • リストの中身を絶対値にしたい → abs関数というのがいけそう
  • 2乗はわかる → **2ですな!
  • ルートの書き方 → math.sqrt というのがあるらしい。
    書いてみた
import math

x = [0, 0]
y = [2, 2]
a = abs(x[0] - y[0])
b = abs(x[1] - y[1])

# マンハッタン
print(a+b)

# ユークリッド
print(math.sqrt(a**2 + b**2))

いや、普通に大量にデータあったらめんどくせ!ってなるやん ↓ からの
なんかnumpyなるものがよさげ。リストのまま渡せる?のかな?

import numpy as np

x = [0, 0]
y = [2, 2]

manhattan = np.sum(np.abs(x - y))
euclidean = np.linalg.norm(x - y)

print(manhattan)
print(euclidean)

動かん……
TypeError: unsupported operand type(s) for -: 'list' and 'list'
なんのことでしょう?

調べた結果、numpy用の配列に入れないとダメだったことが判明。

x = np.array(x)
t = np.array(y)

わかったこと

ライブラリってすげえ

ついでに、ユークリッドさんの本名(?)が気になって調べてみた。
Εὐκλείδης
ギリシャ語でGoogle翻訳から音声出してみたけど、エウクレイデス とかには全然聞こえない。「エフキーリーヴィス」(フは下唇を噛んでる感じの)って聞こえるような。外国の人に聞いたら誰やねんってなるヤツですね。

参考URL

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0