如何计算向量集合之间的成对欧几里得距离



我有一个像这样的pandas数据框架。索引是pd。DatetimeIndex和列都是时间序列。

x_3-4676-982-6354.56-245.6572020-08-195678.642245.27862461.785-2394154.34-735.653-8876-698.245

实现这一点的显式方法是:

from itertools import combinations
import numpy as np
dist_df = pd.DataFrame(index=df.columns, columns=df.columns)
for col_a, col_b in combinations(df.columns, 2):
dist = np.linalg.norm(df[col_a] - df[col_b])
dist_df.loc[col_a, col_b] = dist
dist_df.loc[col_b, col_a] = dist
print(dist_df)

输出
x_1           x_2           x_3
x_1           NaN  12381.858429   6135.306973
x_2  12381.858429           NaN  12680.121047
x_3   6135.306973  12680.121047           NaN

如果您想要0而不是NaN,请使用DataFrame.fillna:

dist_df.fillna(0, inplace=True)

对于任意数量的列,下面的代码都可以工作。

设置>
df = pd.DataFrame(
{
"x1":[133.23, -982, 5678.642, -2394, 236],
"x2":[2457.45, -6354.56, 245.2786, 154.34, -8876],
"x3":[-4676, -245.657, 2461.785, -735.653, 698.245],
}
)
<<p>解决方案/strong>
import numpy as np
aux = np.broadcast_to(df.values,  (df.shape[1], *df.shape))
result = np.sqrt(np.square(aux - aux.transpose()).sum(axis=1))

resultnumpy.array

如果你愿意,你可以像这样把它封装在一个数据框架中

pd.DataFrame(result, columns=df.columns, index=df.columns)
x1            x2            x3
x1      0.000000  12381.858429   6081.352512
x2  12381.858429      0.000000  13622.626775
x3   6081.352512  13622.626775      0.000000

为什么这种方法有效超出了我愿意进入,需要一个强大的数学背景。你需要决定哪个对你更重要:速度,还是可读性/可理解性。

相关内容

  • 没有找到相关文章

最新更新