簡體   English   中英

scipy對從文件導入的2D數據進行插值

[英]scipy interpolate 2D data imported from file

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

我已使用Mathematica在3D圖中計算和顯示非常復雜的函數。 從Mathematica導出是一個真正的難題,並且從來沒有在合理的時間范圍內提供可發布的數字。 Gnuplot在3D繪圖上也不是很好,因此我將繼續使用matplotlib。 通過閱讀文檔,我發現所有繪圖示例都涉及簡單的函數和用戶定義為矢量的變量。 我的第一個問題如下:

我可以將Mathematica中的函數數據導出到一個帶有3個制表符分隔列的文件中(如果有幫助的話,分隔可以是其他東西!)。 第一列是x軸,第二列是y,第三列是z軸。 我需要繪制的基本上是z(x,y)

如何導入這樣的數據文件進行繪圖?

第二個問題是:為了獲得平滑的表面圖,我是否需要對數據進行某種插值? 如果是這種情況,那么該如何處理從我描述的文件中導入的數據呢?

此處的此示例中, scipy.interpolate.interp2d函數(?)需要兩個1D向量x和y以及z的2D向量,以獲得內插函數z(x,y) 但是我的數據是x(第一列)是一維向量,y(第二列)是一維向量,z(第三列)是一維向量。 給出的示例讓我有些困惑,因為它們使用定義的x和y向量以及z的函數,然后繼續進行插值(我在這里看不到插值點)。

我希望有人能以此指向我正確的方向!

不,您不需要定義的函數即可使用scipy的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()

樣本輸出:
在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM