无需循环将pandas DataFrame数据填充到numpy矩阵的实现方法
无循环实现方案
方案1:NumPy高级索引(性能最优,推荐)
NumPy原生支持整数数组批量索引,直接取DataFrame的三列值作为索引和赋值源即可完全替代循环,执行效率远高于遍历写法,尤其适合数据量较大的场景,代码如下:
import pandas as pd import numpy as np import matplotlib.pyplot as plt h,w=25,30 # 矩阵维度 df=pd.DataFrame( { 'row':[1,5,2,4,6,7,15,20], 'col':[3,15,22,29,16,12,25,1], 'val':[444,2313,100,21,159,4102,225,2221] } ) mat = np.zeros((h,w)) # 核心无循环赋值逻辑 mat[df['row'].to_numpy(), df['col'].to_numpy()] = df['val'].to_numpy() plt.imshow(mat)
注意事项
- 该方案逻辑和你原有循环完全一致,如果存在重复的
(row,col)对,后出现的值会覆盖先出现的值 - 请确保
row列的所有值小于矩阵高度h、col列的所有值小于矩阵宽度w,否则会触发索引越界报错
方案2:Pandas透视表(适合需要补全缺失行列的场景)
如果你的输入数据存在行列索引不连续、需要自动补全全量索引的场景,可以用透视表实现:
# 生成全量行列索引的透视表,空缺位置默认填0 pivot_df = df.pivot(index='row', columns='col', values='val').reindex( index=range(h), columns=range(w), fill_value=0 ) mat = pivot_df.values
该方案性能略低于NumPy高级索引方案,更适合小数据集、需要提前做数据规整的场景。
内容的提问来源于stack exchange,提问作者YevKad
相关产品推荐
相关产品推荐

