我在曼哈顿距离工作。它与simple for循环配合得很好。但我尽量避免这种循环。
import numpy as np
import random
A = np.random.randint(5, size=(10, 5))
B = [1, 3, 5, 2, 4]
for i in range(10):
dist = sum(abs(A[i]-B))
print("Distances: ", dist)
有比这更好的方法吗?例如使用高级索引…
谢谢你的指导。
最佳答案
纯numpy
您可以在numpy中执行此操作:
>>> np.sum(np.abs(A-B), axis=1)
array([10, 6, 9, 9, 7, 7, 9, 8, 14, 8])
将其与循环的输出进行比较:
Distances: 10
Distances: 6
Distances: 9
Distances: 9
Distances: 7
Distances: 7
Distances: 9
Distances: 8
Distances: 14
Distances: 8
备选方案:
scipy
如果你愿意的话,你也可以使用
scipy
(我个人更喜欢numpy
方法):from scipy.spatial.distance import cdist
>>> cdist(A,np.array(B).reshape(1,-1), metric='cityblock')
array([[10.],
[ 6.],
[ 9.],
[ 9.],
[ 7.],
[ 7.],
[ 9.],
[ 8.],
[14.],
[ 8.]])