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

如何基于pandas DataFrame的索引数据高效为numpy矩阵赋值

现有方案性能差的原因
  • df.apply逐行执行自定义函数本质是Python层面的显式循环,每处理一行都要经历行对象构造、属性查找、类型校验、函数调用的固定开销,这类开销在10万行规模下会被放大几百倍,远超过赋值操作本身的耗时。
  • swifter这类apply加速工具的核心逻辑是自动判断能不能把自定义函数转成pandas/numpy的向量化操作,但你的函数是修改外部全局矩阵的副作用函数,根本无法被转成向量化逻辑,反而会额外增加类型推断、任务调度的成本,所以耗时更长。
  • 逐行给numpy数组做单元素赋值是随机内存访问,完全无法利用CPU缓存预取、批量内存读写的硬件优化,内存访问效率极低。
最优实现方案

直接用numpy原生的高级索引做批量赋值,全程无Python层循环,代码如下:

import numpy as np

# 如果你的i/j是从1开始计数的(和示例一致),先做偏移转成numpy要求的0-based索引
i_arr = df["i"].to_numpy() - 1
j_arr = df["j"].to_numpy() - 1
v_arr = df["v"].to_numpy()

# 初始化全零矩阵
A_matrix = np.zeros((i_num, j_num))
# 一次性完成所有位置的赋值
A_matrix[i_arr, j_arr] = v_arr

如果你的数据中存在重复的(i,j)对,需要累加对应权重(社交网络场景很常见),就用numpy的无缓冲索引操作实现批量累加:

# 重复坐标对权重累加场景使用
np.add.at(A_matrix, (i_arr, j_arr), v_arr)

补充:如果矩阵非零元素占比很低,还可以直接构造稀疏矩阵节省内存:

from scipy.sparse import coo_matrix
A_sparse = coo_matrix((v_arr, (i_arr, j_arr)), shape=(i_num, j_num))

在你提到的10万行、1000列的规模下,上述numpy方案的耗时通常在10毫秒以内,相比原apply方案有近万倍的提速。

提速原理
  • 所有计算、赋值逻辑全部下沉到C层执行,完全消除了Python层循环、逐行对象构造、函数调用的额外开销。
  • 批量内存操作可以触发CPU的缓存预取、SIMD单指令多数据优化,内存读写效率比逐行随机赋值高几个数量级。
  • 没有第三方工具的额外调度、类型推断成本,直接调用numpy最底层的数组操作接口,执行路径最短。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:06:22