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

如何用Numpy/Scipy函数计算Polars DataFrame列的坐标距离

解决Polars DataFrame中坐标列的距离计算问题

你遇到的核心问题是直接用numpy/scipy的函数处理Polars列表达式(Expr)无效——这些函数是针对numpy数组设计的,而Polars的pl.col()返回的是延迟执行的表达式对象,不是直接的数据数组。另外你代码里的列名写错了(用了大写C,实际是小写c),这也会导致报错。

下面提供两种可行的解决方案:

方案1:用Polars内置数组运算(无需依赖numpy/scipy)

直接通过Polars的数组操作计算欧氏距离,性能更贴合Polars的优化逻辑:

df = df.with_columns(
    # 计算两列表对应元素的差,平方后求和再开平方
    (pl.col("c") - pl.col("d"))
    .arr.map(lambda arr: arr.pow(2).sum().sqrt())
    .alias("distance")
)

或者用更高效的arr.eval方式:

df = df.with_columns(
    pl.col("c")
    .arr.eval(pl.element() - pl.col("d"), parallel=True)
    .arr.map(lambda arr: (arr ** 2).sum() ** 0.5)
    .alias("distance")
)

方案2:用map_elements调用numpy/scipy的函数

如果一定要用你找到的numpy或scipy方法,需要用map_elements逐行处理每个坐标列表:

用numpy.linalg.norm的例子

df = df.with_columns(
    pl.struct(["c", "d"])
    .map_elements(lambda row: np.linalg.norm(row["c"] - row["d"]), return_dtype=pl.Float64)
    .alias("distance")
)

用scipy.spatial.distance的例子

df = df.with_columns(
    pl.struct(["c", "d"])
    .map_elements(lambda row: distance.euclidean(row["c"], row["d"]), return_dtype=pl.Float64)
    .alias("distance")
)

执行上述任意方案后,打印df就能看到新增的distance列,包含每组坐标的欧氏距离。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:35:21