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