df_centroids中每行的7列显示的是7维空间的坐标。
import numpy as np
import pandas as pd
import scipy
df_centroids
0 1 2 3 4 5 6
0 2.443664 -0.158806 -0.403137 0.609063 -0.412371 -0.486611 -0.687598
1 -0.389052 1.258986 -0.517471 -0.127748 0.379712 -0.486611 -0.143564
2 -0.215555 0.201088 1.149816 -0.501471 0.275600 -0.088475 1.434132
3 -0.227075 -0.806379 -0.412111 -0.174150 -0.417327 -0.401676 -0.234962
4 -0.130615 0.197548 1.282325 -0.940454 0.161774 2.167632 -0.263252
5 0.015202 -0.125552 -0.665733 1.792274 -0.360096 -0.390093 -0.044649
我试图计算从原点出发的欧氏距离,并将其保存在 "欧氏距离 "列中。请看下面的代码。
df_centroids['Euclidean Distance']=''
from scipy.spatial import distance
i=0
while i<len(df_centroids.index):
centroid=[df_centroids.iloc[i,0], df_centroids.iloc[i,1], df_centroids.iloc[i,2], df_centroids.iloc[i,3], df_centroids.iloc[i,4], df_centroids.iloc[i,5], df_centroids.iloc[i,6]]
df_centroids[i,7]=distance.euclidean([0, 0, 0, 0, 0, 0, 0], centroid)
i+=1
df_centroids
0 1 2 3 4 5 6 'Euclidean Distance' (0, 7) (1, 7) (2, 7) (3, 7) (4, 7) (5, 7) (6, 7) (7, 7)
0 2.443664 -0.158806 -0.403137 0.609063 -0.412371 -0.486611 -0.687598 2.722099 1.556305 1.949607 1.136964 2.716432 1.988787 7.161965 6.851439
1 -0.389052 1.258986 -0.517471 -0.127748 0.379712 -0.486611 -0.143564 2.722099 1.556305 1.949607 1.136964 2.716432 1.988787 7.161965 6.851439
2 -0.215555 0.201088 1.149816 -0.501471 0.275600 -0.088475 1.434132 2.722099 1.556305 1.949607 1.136964 2.716432 1.988787 7.161965 6.851439
3 -0.227075 -0.806379 -0.412111 -0.174150 -0.417327 -0.401676 -0.234962 2.722099 1.556305 1.949607 1.136964 2.716432 1.988787 7.161965 6.851439
4 -0.130615 0.197548 1.282325 -0.940454 0.161774 2.167632 -0.263252 2.722099 1.556305 1.949607 1.136964 2.716432 1.988787 7.161965 6.851439
5 0.015202 -0.125552 -0.665733 1.792274 -0.360096 -0.390093 -0.044649 2.722099 1.556305 1.949607 1.136964 2.716432 1.988787 7.161965 6.851439
6 0.256554 1.422368 1.139299 -0.917565 6.804388 -0.486611 0.726889 2.722099 1.556305 1.949607 1.136964 2.716432 1.988787 7.161965 6.851439
7 6.010360 0.643581 2.401293 -1.193860 0.068166 1.636784 0.726889 2.722099 1.556305 1.949607 1.136964 2.716432 1.988787 7.161965 6.851439
如你所见,这段代码没有计算欧氏空间,而是创建了8个新的列,并为所有行复制了同一组值。我到底错在哪里?
我试着在网上查找解决方法,但至今没有找到。真的很感谢任何帮助。
当使用 numpy
你通常不需要使用循环。对于大多数的使用情况,存在高度调整的向量和矩阵操作。
对于你的问题,请注意,欧氏距离原点的距离与欧氏法线是一样的。有一个 作用于 numpy.linalg
为,。
要计算一个向量的欧氏(l-2)法线。
import np
np.linalg.norm([1, 2, 3])
# 3.7416573867739413
要计算一个矩阵的规范 行向量 每一行都要单独计算(就像你的问题一样)。
np.linalg.norm([[1,2,3],
[4,5,6]], axis=1)
# array([3.74165739, 8.77496439])
要计算一个矩阵的规范 列向量 每一列都有单独的.iloc。
np.linalg.norm([[1, 4],
[2, 5],
[3, 6]], axis=0)
# array([3.74165739, 8.77496439])
在你的代码中,你缺少了.iloc,应该是:
df.iloc[i, 7]
而不是:
df[i, 7]
为了避免这样的错误,我会使用apply:
sample = {'a': [2, 2, 3],'b': [3, 5, 2], 'c': [3, 6, 2]}
df = pd.DataFrame(sample)
origin = [0,0,0]
df['distance'] = df.apply(lambda x: distance.euclidean(origin, x), axis=1)
print(df)
>>> a b c distance
>>> 0 2 3 3 4.690416
>>> 1 2 5 6 8.062258
>>> 2 3 2 2 4.123106