scipy对从文件导入的2D数据进行插值

时间:2018-07-20 06:57:11

标签: python numpy matplotlib scipy

这是我第一次使用python,scipy和此任务所需的所有概念。

我已经使用Mathematica在3D图中计算和显示非常复杂的函数。从Mathematica导出是一个真正的难题,并且从来没有在合理的时间范围内提供可发布的数字。 Gnuplot在3D绘图上也不是很好,因此我将继续使用matplotlib。通过阅读文档,我发现所有绘图示例都涉及简单的函数和用户定义为矢量的变量。我的第一个问题如下:

我可以将Mathematica中的功能数据导出到一个带有3个制表符分隔列的文件中(如果有帮助的话,分隔可以是其他方式!)。第一列是x轴,第二列是y,第三列是z轴。我需要绘制的基本上是z(x,y)

如何导入此类数据文件进行绘图?

第二个问题是:为了获得平滑的表面图,我是否需要对数据进行某种插值?如果是这样,那么如何处理从我描述的文件中导入的数据?

在此示例here中,scipy.interpolate.interp2d函数(?)需要两个1D向量x和y以及z的2D向量,以获得内插函数z(x,y)。但是我的数据是x(第一列)是一维向量,y(第二列)是一维向量,z(第三列)是一维向量。 给出的示例让我有些困惑,因为它们使用定义的x和y向量以及z的函数,然后继续进行插值(我在这里看不到插值点)。

我希望有人会以此指向我正确的方向!

1 个答案:

答案 0 :(得分:2)

否,您不需要定义的函数即可使用scipy's griddata。我们可以对任何给定的数据集进行插值,例如z =x²+y²+ 1,其中一些数据点已删除:

0   0   1
1   0   2
3   0   10
0   1   2
1   1   3
2   1   6
0   2   5
1   2   6
2   2   9
3   2   14
0   3   10
2   3   14
3   3   19

以下代码从这些数据点插入3D曲面:

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from scipy.interpolate import griddata

#read data points from text file, could be also a csv reader
arr = np.genfromtxt("test.txt")
#extract x, y, z
x = arr[:,0]
y = arr[:,1]
z = arr[:,2]

#create figure with a 3D projection axis
fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")

#number of data points per axis
n = 20
#upsample evenly along x and y axis
x_up = np.linspace(np.min(x), np.max(x), n)
y_up = np.linspace(np.min(y), np.max(y), n)

#create grid from these updsampled 1D arrays
x3d, y3d = np.meshgrid(x_up, y_up)
#interpolate z-values for this regular grid
#x, y, z are your original data points
#methods other than cubic are available
z3d = griddata((x, y), z, (x3d, y3d), method = "cubic")

#plot surface
ax.plot_surface(x3d, y3d, z3d)

#plot original data points on top
ax.scatter(x, y, z, color = "black", marker = "x", s = 50)

ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_zlabel("Z")

plt.show()

样本输出:
enter image description here