如何对需要插值特定数据点的python代码进行矢量化

如何对需要插值特定数据点的python代码进行矢量化,python,python-2.7,numpy,scipy,vectorization,Python,Python 2.7,Numpy,Scipy,Vectorization,我有一个问题,我使用一个叫做MCNP的计算机程序,从粒子通量计算正方形几何体中的能量沉积。方形几何体被分解为一个网格,长度、宽度和高度为50立方网格。将数据放入文本文件中,显示笛卡尔坐标系中每个网格的质心位置(x、y和z位置)以及该x、y和z坐标处的能量沉积。然后使用Python脚本提取数据。我有一个脚本,允许我在z平面上切片,并在该平面上绘制能量沉积的热图,该脚本可以工作,但我认为它不是非常有效,我正在寻找解决方案来矢量化该过程 # - This transforms the read in

我有一个问题,我使用一个叫做MCNP的计算机程序,从粒子通量计算正方形几何体中的能量沉积。方形几何体被分解为一个网格,长度、宽度和高度为50立方网格。将数据放入文本文件中,显示笛卡尔坐标系中每个网格的质心位置(x、y和z位置)以及该x、y和z坐标处的能量沉积。然后使用Python脚本提取数据。我有一个脚本,允许我在z平面上切片,并在该平面上绘制能量沉积的热图,该脚本可以工作,但我认为它不是非常有效,我正在寻找解决方案来矢量化该过程

# - This transforms the read in data from a list to a numpy array
#   where Magnitude represents the energy deposition
XArray = np.array(XArray); YArray = np.array(YArray)
ZArray = np.array(ZArray); Magnitude = np.array(Magnitude)

#==============================================================
# - This section creates planar data for a 2-D plot

# Interpolation function for determining 2-D slice of 3-D data
def Interpolate(X1,X2,Y1,Y2,X3):
    Slope = (Y2-Y1)/(X2-X1)
    Y3 = (X3-X1)*Slope
    Y3 = Y3 + Y1
    return Y3

# This represents the location on the Z-axis where a slice is taken
Slice_Location = 0.0

XVal = []; YVal = []; ZVal = []
Tally = []; Error = []
counter = 1.0
length = len(XArray)-1
for numbers in range(length):
 #   - If data falls on the selected plane location then use existing data
    if ZArray[counter] == Slice_Location:       
        XVal.append(XArray[counter])
        YVal.append(YArray[counter])
        ZVal.append(ZArray[counter])
        Tally.append(float(Magnitude[counter]))

# - If existing data does not exist on selected plane then interpolate
    if ZArray[counter-1] < Slice_Location and ZArray[counter] > Slice_Location:
        XVal.append(XArray[counter])
        YVal.append(YArray[counter])
        ZVal.append(Slice_Location)
        Value = Interpolate(ZArray[counter-1],ZArray[counter],Magnitude[counter-1], \
                           Magnitude[counter],Slice_Location)
        Tally.append(float(Value))
    counter = counter + 1

XVal = np.array(XVal); YVal = np.array(YVal); ZVal = np.array(ZVal)
Tally = np.array(Tally);
代码在X、Y和Z坐标中读取为三个单独的1-D numpy阵列,并在该坐标处读取能量沉积为1-D numpy阵列。为了便于描述,假设我想在Z坐标为零的位置取一个切片,但是没有一个网格质心在Z坐标为0的位置,那么我必须(并且确实)循环遍历Z坐标数组中的所有数据点,直到找到一个大于零的数据点(数组索引I),并继续执行数组索引(I-1)这小于零。然后,它需要使用Z空间中的这些阵列点以及切片位置(在本例中为0)和这些阵列索引处的能量沉积,并进行插值以找到切片的该Z位置处的正确能量沉积。由于X和Y阵列不受影响,现在我有了X,Y的坐标,可以绘制特定X,Y位置的热图和切片位置的能量沉积。代码还需要确定切片位置是否已经在数据集中,在这种情况下,不需要插值。我的代码可以工作,但我不知道如何使用内置的scipy插值方案,而是编写了一个函数来进行插值。在这个场景中,我必须使用for循环进行迭代,直到找到z位置在切片位置上下的位置(本例中z=0)。我在这篇文章中附上了我的示例代码,并请求帮助更好地矢量化这段代码片段(如果可以更好地矢量化的话),希望在此过程中能学到一些东西

# - This transforms the read in data from a list to a numpy array
#   where Magnitude represents the energy deposition
XArray = np.array(XArray); YArray = np.array(YArray)
ZArray = np.array(ZArray); Magnitude = np.array(Magnitude)

#==============================================================
# - This section creates planar data for a 2-D plot

# Interpolation function for determining 2-D slice of 3-D data
def Interpolate(X1,X2,Y1,Y2,X3):
    Slope = (Y2-Y1)/(X2-X1)
    Y3 = (X3-X1)*Slope
    Y3 = Y3 + Y1
    return Y3

# This represents the location on the Z-axis where a slice is taken
Slice_Location = 0.0

XVal = []; YVal = []; ZVal = []
Tally = []; Error = []
counter = 1.0
length = len(XArray)-1
for numbers in range(length):
 #   - If data falls on the selected plane location then use existing data
    if ZArray[counter] == Slice_Location:       
        XVal.append(XArray[counter])
        YVal.append(YArray[counter])
        ZVal.append(ZArray[counter])
        Tally.append(float(Magnitude[counter]))

# - If existing data does not exist on selected plane then interpolate
    if ZArray[counter-1] < Slice_Location and ZArray[counter] > Slice_Location:
        XVal.append(XArray[counter])
        YVal.append(YArray[counter])
        ZVal.append(Slice_Location)
        Value = Interpolate(ZArray[counter-1],ZArray[counter],Magnitude[counter-1], \
                           Magnitude[counter],Slice_Location)
        Tally.append(float(Value))
    counter = counter + 1

XVal = np.array(XVal); YVal = np.array(YVal); ZVal = np.array(ZVal)
Tally = np.array(Tally);
#-将读取的数据从列表转换为numpy数组
#其中,幅值表示能量沉积
XArray=np.数组(XArray);YArray=np.数组(YArray)
ZArray=np.数组(ZArray);震级=np.阵列(震级)
#==============================================================
#-本节为二维绘图创建平面数据
#确定三维数据二维切片的插值函数
def插值(X1、X2、Y1、Y2、X3):
斜率=(Y2-Y1)/(X2-X1)
Y3=(X3-X1)*斜率
Y3=Y3+Y1
返回Y3
#这表示在Z轴上获取切片的位置
切片位置=0.0
XVal=[];YVal=[];ZVal=[]
理货=[];错误=[]
计数器=1.0
长度=len(XArray)-1
对于范围(长度)内的数字:
#-如果数据落在选定的平面位置上,则使用现有数据
如果ZArray[计数器]==切片位置:
追加(XArray[计数器])
YVal.append(YArray[计数器])
ZVal.append(ZArray[计数器])
Tally.append(浮点值[计数器])
#-如果选定平面上不存在现有数据,则插值
如果ZArray[计数器-1]<切片位置和ZArray[计数器]>切片位置:
追加(XArray[计数器])
YVal.append(YArray[计数器])
ZVal.append(切片位置)
值=插值(ZArray[计数器-1]、ZArray[计数器]、幅值[计数器-1]\
幅值[计数器],切片位置)
计数。追加(浮动(值))
计数器=计数器+1
XVal=np.数组(XVal);YVal=np.数组(YVal);ZVal=np.阵列(ZVal)
Tally=np.数组(Tally);