對于一維向量/陣列,它更容易。例如:
array1 = [1, 2, 3]
array2 = [1, 1, 1]
曼哈頓距離將是: (0 1 2) 即 3
import numpy as np
def cityblock_distance(A, B):
result = np.sum([abs(a - b) for (a, b) in zip(A, B)])
return result
2 個點的輸出將是: 3 但是二維陣列/向量呢?例如,對于像這樣的兩個 2D 向量(如下),曼哈頓(或 L1 或城市街區)將是什么:
arr1 = [[29, 30, 36, 30, 18],[37, 37, 49, 54, 23]]
arr2 = [[31, 33, 37, 34, 22],[37, 38, 50, 58, 26]]
如果我使用上面提到的代碼,它會給出 3 作為 1 D 矢量的輸出。對于 2D 向量,它的輸出顯示為 2281。在我看來,邏輯曼哈頓距離應該是這樣的:
兩個陣列之間第一項的差異:2,3,1,4,4 總和為 14
兩個陣列之間第二項的差異:0,1,1,4,3,即 9。
總和將為 23,因此這兩個 2D 陣列之間的曼哈頓距離將為 23。
我的計算有問題還是我的 L1 距離概念有問題?
uj5u.com熱心網友回復:
如果arr1并且arr2是 numpy 陣列,您可以使用:
# skip if already numpy arrays:
arr1 = np.array(arr1)
arr2 = np.array(arr2)
x = np.sum(np.abs(arr1 - arr2))
print(x)
印刷:
23
uj5u.com熱心網友回復:
您可以通過依次比較 2d 陣列中的每個串列(將代碼用于 1D 案例)然后對結果求和來修改代碼以計算所需的結果:
def cityblock_distance(A, B):
result = np.sum([np.sum([abs(a - b) for (a, b) in zip(C, D)]) for C, D in zip(A, B)])
return result
cityblock_distance(arr1,arr2)
輸出:
23
uj5u.com熱心網友回復:
即使在修復縮進之后,您撰寫的代碼也不起作用:
In [177]:
...: def cityblock_distance(A, B):
...: result = np.sum([abs(a - b) for (a, b) in zip(A, B)])
...: return result
...:
In [178]: arr1=[[29, 30, 36, 30, 18],[37, 37, 49, 54, 23]]; arr2=[[31, 3
...: 3, 37, 34, 22],[37, 38, 50, 58, 26]]
In [179]: cityblock_distance(arr1, arr2)
------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-179-d1b44e49141d> in <module>
----> 1 cityblock_distance(arr1, arr2)
<ipython-input-177-907001cbfc9b> in cityblock_distance(A, B)
1 def cityblock_distance(A, B):
----> 2 result = np.sum([abs(a - b) for (a, b) in zip(A, B)])
3 return result
<ipython-input-177-907001cbfc9b> in <listcomp>(.0)
1 def cityblock_distance(A, B):
----> 2 result = np.sum([abs(a - b) for (a, b) in zip(A, B)])
3 return result
TypeError: unsupported operand type(s) for -: 'list' and 'list'
如果您轉換為陣列,您將獲得所需的 L1 范數:
In [180]: cityblock_distance(np.array(arr1), np.array(arr2))
Out[180]: 23
但是,因為默認情況下numpy.sum對陣列中的所有元素求和,所以您可以完全省略串列推導:
In [181]: np.sum(abs(np.array(arr1)-np.array(arr2)))
Out[181]: 23
維基百科將您的規范稱為“入門級 1,1 規范”。您可以使用以下公式計算矩陣 1-范數(“最大絕對行總和”)numpy.linalg.norm:
In [193]: np.linalg.norm(np.array(arr1)-np.array(arr2), 1)
Out[193]: 8.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/468398.html
標籤:Python 数组 距离 numpy-ndarray 欧式距离
上一篇:檢查陣列是否使用遞回排序
下一篇:沒有收到任何錯誤并輸出C
