Python中基于X/Y网格计算注水井流函数出现ValueError问题咨询
报错根因
- 井名匹配不一致:你示例CSV中井名格式为
MW-1、MW-2,但代码筛选时用的是MW1,匹配结果异常;且直接取MW1['Q']得到的是带索引的pandas Series对象,和numpy数组运算时会触发pandas的索引对齐校验,最终抛出长度不匹配错误。 - 冗余操作导致维度混乱:额外加的
np.vectorize封装、X[None,:]维度扩展完全没必要,numpy原生支持广播运算,多余的维度调整会导致运算维度不匹配。
修复后可运行代码
import pandas as pd import math import numpy as np IW = pd.read_csv(r'Injection_wells.csv') # 提取单井参数转成标量,避免Series索引问题,同时修正井名匹配规则 mw1_q = IW[IW['Name'] == 'MW-1']['Q'].values[0] mw1_x = IW[IW['Name'] == 'MW-1']['X'].values[0] mw1_y = IW[IW['Name'] == 'MW-1']['Y'].values[0] mw2_q = IW[IW['Name'] == 'MW-2']['Q'].values[0] mw2_x = IW[IW['Name'] == 'MW-2']['X'].values[0] mw2_y = IW[IW['Name'] == 'MW-2']['Y'].values[0] mw3_q = IW[IW['Name'] == 'MW-3']['Q'].values[0] mw3_x = IW[IW['Name'] == 'MW-3']['X'].values[0] mw3_y = IW[IW['Name'] == 'MW-3']['Y'].values[0] # 初始化网格 xi = np.linspace(2517675,2517800,625) yi = np.linspace(996300,996375,375) X,Y = np.meshgrid(xi,yi) # 直接用numpy广播完成全网格计算,用arctan2避免除零问题 PSI = (mw1_q/(2*math.pi)) * np.arctan2(X - mw1_x, Y - mw1_y) + \ (mw2_q/(2*math.pi)) * np.arctan2(X - mw2_x, Y - mw2_y) + \ (mw3_q/(2*math.pi)) * np.arctan2(X - mw3_x, Y - mw3_y)
核心修改说明
- 提取井参数时用
.values[0]把pandas Series转为纯数值标量,完全规避pandas索引对齐的校验逻辑 - 修正井名匹配规则,和CSV中存储的
MW-1格式完全对齐 - 移除冗余的
np.vectorize和多余的维度扩展,直接用numpy原生广播能力完成全网格计算,运算效率更高 - 用
np.arctan2替代np.arctan,自动处理除数为0的边界情况,得到的方位角结果范围更符合渗流场流函数计算的要求
内容的提问来源于stack exchange,提问作者Melanie
相关产品推荐
相关产品推荐

