将含x、y、z、v列的Pandas DataFrame转换为NumPy 3D网格
将规则间隔的Pandas DataFrame转换为NumPy 3D网格
核心思路
由于你的DataFrame中x、y、z坐标是**规则间隔(步长为1)**的长方体网格,我们可以通过排序、提取维度信息、重塑数组的方式快速得到可用于Numba加速的3D数组。
步骤与代码实现
1. 导入依赖库
import pandas as pd import numpy as np from numba import njit
2. 确保数据顺序正确
先按x、y、z升序排序,保证坐标点的连续性,避免reshape时出现错位:
# 按x→y→z的顺序排序数据 df_sorted = df.sort_values(by=['x', 'y', 'z'])
3. 提取网格维度信息
获取x、y、z的唯一取值,并计算各维度的尺寸:
# 获取各轴的唯一坐标值 x_vals = df_sorted['x'].unique() y_vals = df_sorted['y'].unique() z_vals = df_sorted['z'].unique() # 计算3D网格的各维度大小 nx, ny, nz = len(x_vals), len(y_vals), len(z_vals)
4. 验证数据完整性(可选)
检查总点数是否等于各维度乘积,确保没有缺失的坐标点:
assert len(df_sorted) == nx * ny * nz, "数据中存在缺失的网格点,请检查原始数据"
5. 转换为3D NumPy数组
将v列的值重塑为3D数组,维度顺序为(x, y, z):
# 重塑为3D数组 v_3d = df_sorted['v'].values.reshape(nx, ny, nz)
6. 生成对应网格坐标(可选)
如果需要可视化或坐标相关计算,用np.meshgrid生成匹配的3D坐标网格(注意使用indexing='ij'保证维度顺序一致):
# 生成与v_3d维度匹配的3D坐标网格 X, Y, Z = np.meshgrid(x_vals, y_vals, z_vals, indexing='ij')
用Numba加速处理示例
现在可以直接用njit装饰器加速你的块模型处理逻辑:
@njit def process_block(v_grid): # 示例:计算内部点的6邻域平均值 res = np.zeros_like(v_grid) nx, ny, nz = v_grid.shape for i in range(1, nx-1): for j in range(1, ny-1): for k in range(1, nz-1): res[i,j,k] = (v_grid[i-1,j,k] + v_grid[i+1,j,k] + v_grid[i,j-1,k] + v_grid[i,j+1,k] + v_grid[i,j,k-1] + v_grid[i,j,k+1]) / 6 return res # 调用加速函数 processed_v = process_block(v_3d)
内容的提问来源于stack exchange,提问作者Spon
相关产品推荐
相关产品推荐

