You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于k聚类处理Iris数据集:计算dataframe行与质心的笛卡尔距离

数据格式选择结论

优先把质心转为numpy数组即可,无需转成pandas DataFrame,也不用转list,numpy的广播机制可以直接实现批量运算,比纯list循环效率高很多。你的自定义距离函数逻辑完全正确,不需要替换成其他函数,下面两种实现方案都只依赖numpy和pandas,符合你的要求:


方案1:沿用现有自定义函数(逻辑完全匹配你的写法,最易理解)

你写的dis函数可以直接复用,结合pandas的apply按行遍历特征DataFrame即可:

# 你现有的距离函数无需修改
def dis(x,y):
    distance=0
    for i in range(len(x)):
        distance= distance + (y[i]-x[i])**2
    return distance**.5

centroid1 = [5.1,3.4,1.2,0.2]
# axis=1代表按行遍历,每行的特征值会传入row参数
df_features['distance_to_centroid1'] = df_features.apply(lambda row: dis(row.values, centroid1), axis=1)

需要计算另外两个质心的距离时,替换centroid1变量和新列名即可。


方案2:numpy向量化实现(无显性循环,效率更高)

利用numpy的广播特性,可以不用写for循环,一行代码完成150行数据的距离计算,更贴近科学计算的常规实现逻辑:

import numpy as np

centroid1 = [5.1,3.4,1.2,0.2]
centroid1_arr = np.array(centroid1)
# 批量计算所有行到质心的欧氏距离
df_features['distance_to_centroid1'] = np.sqrt(np.sum((df_features.values - centroid1_arr)**2, axis=1))

运算逻辑拆解:

  1. df_features.values 把150行4列的特征DataFrame转为shape为(150,4)的numpy数组
  2. df_features.values - centroid1_arr 利用numpy广播机制,自动把shape为(4,)的质心数组扩展为(150,4),每一行特征都和质心对应位置做减法
  3. **2 对所有差值做平方运算
  4. np.sum(..., axis=1) 按行求和,得到150个平方和结果
  5. np.sqrt(...) 对每个平方和开根号,得到最终的欧氏距离

注意事项

无论使用哪种方案,都要保证质心的元素顺序和特征DataFrame的列顺序完全一致,否则计算出的距离会出错。

内容的提问来源于stack exchange,提问作者Veneratu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 16:27:05