首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python/Pandas中跨可变列数应用函数

在Python/Pandas中跨可变列数应用函数
EN

Stack Overflow用户
提问于 2018-07-10 00:44:07
回答 1查看 33关注 0票数 0

我有一个数据集,它具有可变数量维度的points,坐标为原始坐标和相应的中心:

代码语言:javascript
复制
point | c_1 | c_2 | ... | c_n | center_1 | center_2 | ... | center_n
--------------------------------------------------------------------
  p_1 | 0.1 | 0.3 | ... | 0.5 |      1.2 |      1.1 | ... |      0.7
  p_2 | 1.0 | 1.5 | ... | 1.7 |      3.1 |      2.0 | ... |      1.3
  p_3 | 0.5 | 0.8 | ... | 1.0 |      2.0 |      1.2 | ... |      3.8
  ... | ... | ... | ... | ... |      ... |      ... | ... |      ...

现在,我需要计算每个点到其中心的Euclidean距离。

例如,包含三个点的简化三维数据集如下所示:

代码语言:javascript
复制
point | c_1 | c_2 | c_3 | center_1 | center_2 | center_3 | distance
-------------------------------------------------------------------
  p_1 | 0.0 | 0.0 | 0.0 |      1.0 |      1.0 |      1.0 |    1.732   
  p_2 | 1.0 | 1.0 | 1.0 |      3.0 |      3.0 |      3.0 |    3.464
  p_3 | 0.5 | 0.5 | 0.5 |      2.0 |      2.0 |      2.0 |    2.598

我可以在一维上执行以下操作:

代码语言:javascript
复制
import pandas as pd
import numpy as np
points = pd.DataFrame({
    "point": ("p_1", "p_2", "p_3"), 
    "c_1": (0.0, 1.0, 0.5),
    "c_2": (0.0, 1.0, 0.5),
    "c_3": (0.0, 1.0, 0.5),
    "center_1": (1.0, 3.0, 2.0),
    "center_2": (1.0, 3.0, 2.0),
    "center_3": (1.0, 3.0, 2.0)
})
points['distance'] = points.apply(lambda row:
                     np.linalg.norm(row['c_1']-row['center_1']), axis=1)

但是如何在给定范围的可变维度上更好地做到这一点,比如10?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-10 00:53:15

IIUC

代码语言:javascript
复制
from scipy.spatial import distance
a=distance.cdist(df[['c_1','c_2','c_2']].values, df[['center_1','center_2','center_3']].values)
a[np.arange(len(a)),np.arange(len(a))]
Out[249]: array([1.73205081, 3.46410162, 2.59807621])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51250361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档