簡體   English   中英

如何使用Python內插3D曲面圖(2D數組)的缺失值(未定義區域)?

[英]How can I interpolate missing values (undefined areas) of a 3D surface plot (2D array) using Python?

在使用Numpy和matplotlib的Python 3.7中,我想為以下方程式繪制3D曲面:

F(X,Y)=的sin(x)SIN(Y)/(X * Y)

顯然,該函數在x = 0y = 0時未定義。

要計算和繪制此圖,我有以下代碼,當前在Jupyter Notebook中運行:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
%matplotlib notebook

f = lambda x, y: np.sin(x)*np.sin(y)/(x*y)

xs, ys = np.mgrid[-np.pi:np.pi:31j, -np.pi:np.pi:31j]
zs = f(xs, ys)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

ax.plot_surface(X=xs, Y=ys, Z=zs)

請注意該圖,它缺少值: 在此處輸入圖片說明

如何對缺失值進行插值,以使圖形顯得平滑?

Scipy具有可以執行此操作的插值模塊。 依靠以上內容(在問題發布中),此代碼可以在下一個單元格中運行:

from scipy import interpolate

# integer arrays for indexing
x_indx, y_indx = np.meshgrid(np.arange(0, zs.shape[1]),
                             np.arange(0, zs.shape[0]))

# mask all invalid values
zs_masked = np.ma.masked_invalid(zs)

# retrieve the valid, non-Nan, defined values
valid_xs = x_indx[~zs_masked.mask]
valid_ys = y_indx[~zs_masked.mask]
valid_zs = zs_masked[~zs_masked.mask]

# generate interpolated array of z-values
zs_interp = interpolate.griddata((valid_xs, valid_ys), valid_zs.ravel(),
                                 (x_indx, y_indx), method='cubic')

# finally, plot the data 
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

ax.plot_surface(X=xs, Y=ys, Z=zs_interp)

返回下圖: 在此處輸入圖片說明

請注意,此代碼已針對可讀性和可理解性(而非內存效率)進行了優化。 重新優化此代碼以提高內存效率是一項瑣碎的任務,留給讀者

在這種情況下,您可以使用scipy.special.sinc 這將插入精確結果sin(0)/0 = 1

import numpy as np
from scipy.special import sinc
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
%matplotlib notebook

f = lambda x, y: sinc(x)*sinc(y)

xs, ys = np.mgrid[-1:1:31j, -1:1:31j]
zs = f(xs, ys)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

ax.plot_surface(X=xs*np.pi, Y=ys*np.pi, Z=zs)

在此處輸入圖片說明

暫無
暫無

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

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