求 python 中 2 个多维数组之间的 minkowski 距离

To find minkowski distance between 2 multidimensional arrays in python

我有一个数据框 'df',我想从中提取值并放入 2 个不同的 3D 数组。 然后我想找到数据集中整组值的两个数组之间的 minkowski 距离,并将这些值(根据 p_values)附加到原始数据框。 但是我无法正确创建函数

我的 df 看起来像:

    x1         y1       z1        x2        y2        z2
0  0.040928  0.250813  0.258730  0.050584  0.298290  0.273055
1  0.000000  0.174905  0.228518  0.011435  0.215528  0.233548
2  0.990905  0.746038  0.790401  0.972913  0.755414  0.822155
3  0.914052  0.669185  0.707238  0.922316  0.676172  0.734213
4  0.909504  0.480774  0.484074  0.915810  0.503221  0.489242

然后我将 2 个数组 p1 和 p2 定义为:

p1 = df[["x1", "y1", "z1"]].to_numpy() 
p2 = df[["x2", "y2", "z2"]].to_numpy() 

现在我想计算两个数组之间不同 p 值的 minkowski 值:

from math import sqrt
 
# calculate minkowski distance
def minkowski_distance(a, b, p):
    return sum(abs(e1-e2)**p for e1, e2 in zip(a,b))**(1/p)

dist = minkowski_distance(p1,p2, 2)
dist
array([13.0317225 ,  9.36364486,  7.56526207])

我希望生成的数据框如下所示:

x1  y1  z1  x2  y2  z2  m(1)  m(2)  m(3) ...

其中 m(1) 表示 p=1 的闵可夫斯基距离,依此类推 并且此数据框的所有行应对应于要计算距离的行值,即

(x1, y1, z1) <---------m--------> (x2,y2,z2)

你可以尝试用向量化的方式计算闵可夫斯基距离:

def minkowski_distance(a, b, p=2):
    return np.sum(np.abs(a - b)**p, axis=1)**(1/p)

for p in range(1, 4):
    df[f'm({p})'] = minkowski_distance(p1, p2, p)