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

Polars中如何用1×n NumPy数组对DataFrame多列执行减法?

解决Polars中NumPy数组与多列DataFrame减法运算的问题

报错原因

map_rows要求lambda函数返回元组类型,你返回的numpy数组不符合类型要求,因此抛出ComputeError: expected tuple, got ndarray。而计算范数时返回的是单个数值(可自动转为元组),所以能正常运行。

解决方案

方案1:向量化广播(推荐,性能最优)

Polars支持自动广播机制,直接将NumPy数组转为Polars Series,与选中的列做减法即可,无需逐行处理:

import polars as pl
import numpy as np

df = pl.DataFrame(np.random.randn(6, 4), schema=['#', 'x', 'y', 'z'])
arr = np.array([-10, -20, -30])

# 选中目标列并与数组广播相减
result = df.select(pl.col(r'^(x|y|z)$')) - pl.Series(arr)
print(result)

输出示例:

shape: (6, 3)
┌───────────┬───────────┬───────────┐
│ x         ┆ y         ┆ z         │
│ ---       ┆ ---       ┆ ---       │
│ f64       ┆ f64       ┆ f64       │
╞═══════════╪═══════════╪═══════════╡
│ 10.143819 ┆ 21.875335 ┆ 29.682364 │
│ 10.360651 ┆ 21.116404 ┆ 28.871060 │
│ 9.777666  ┆ 20.846593 ┆ 30.325185 │
│ 9.394726  ┆ 19.357053 ┆ 29.716592 │
│ 9.223525  ┆ 21.618511 ┆ 30.390805 │
│ 9.751234  ┆ 21.667080 ┆ 27.393393 │
└───────────┴───────────┴───────────┘

方案2:修改map_rows返回值为元组

如果必须使用map_rows,只需将numpy数组转为元组即可:

result = df.select(pl.col(r'^(x|y|z)$')).map_rows(
    lambda x: tuple(np.array(x) - arr)
)
print(result)

方案3:列级批量匹配

针对列数较多的场景,可通过列表推导式自动匹配列与数组元素:

target_cols = df.select(pl.col(r'^(x|y|z)$')).columns
result = df.with_columns(
    [pl.col(col) - arr[i] for i, col in enumerate(target_cols)]
).select(target_cols)
print(result)

说明

  • 优先使用方案1,Polars的向量化操作基于Arrow引擎,比逐行处理的map_rows效率高一个数量级,尤其适合大数据集。
  • 该实现逻辑与Pandas的广播机制一致,但Polars在内存占用和计算速度上更有优势。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 17:11:15