32

Python と matplotlib に単純な問題があります。私は3つのリストを持っています:x、y、およびrho [i]はポイントx [i]、y [i]での密度です。x と y の値はすべて -1 の間です。および 1. ただし、特定の順序ではありません。

密度 rho (点 x、y で補間) の等高線図 (imshow と同様) を作成する方法。

どうもありがとうございました。

編集:私は大きな配列を扱っています:x、y、およびrhoには10,000から1,000,000の要素があります

4

2 に答える 2

51

値を補間する必要がありrhoます。これを行う方法は 1 つではありません。「最良の」方法は、補間に組み込むアプリオリな情報に完全に依存します。

ただし、「ブラック ボックス」内挿法について暴言を吐く前に、動径基底関数 (たとえば、「薄板スプライン」は特定のタイプの動径基底関数です) が適切な選択であることがよくあります。何百万ものポイントがある場合、この実装は非効率的ですが、出発点として:

import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate

# Generate data:
x, y, z = 10 * np.random.random((3,10))

# Set up a regular grid of interpolation points
xi, yi = np.linspace(x.min(), x.max(), 100), np.linspace(y.min(), y.max(), 100)
xi, yi = np.meshgrid(xi, yi)

# Interpolate
rbf = scipy.interpolate.Rbf(x, y, z, function='linear')
zi = rbf(xi, yi)

plt.imshow(zi, vmin=z.min(), vmax=z.max(), origin='lower',
           extent=[x.min(), x.max(), y.min(), y.max()])
plt.scatter(x, y, c=z)
plt.colorbar()
plt.show()

ここに画像の説明を入力

于 2012-01-25T19:01:32.130 に答える
14

scipy を使用できますgriddata(Scipy >= 0.10 が必要)。これは三角形分割ベースの方法です。

import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate

# Generate data: for N=1e6, the triangulation hogs 1 GB of memory
N = 1000000
x, y = 10 * np.random.random((2, N))
rho = np.sin(3*x) + np.cos(7*y)**3

# Set up a regular grid of interpolation points
xi, yi = np.linspace(x.min(), x.max(), 300), np.linspace(y.min(), y.max(), 300)
xi, yi = np.meshgrid(xi, yi)

# Interpolate; there's also method='cubic' for 2-D data such as here
zi = scipy.interpolate.griddata((x, y), rho, (xi, yi), method='linear')

plt.imshow(zi, vmin=rho.min(), vmax=rho.max(), origin='lower',
           extent=[x.min(), x.max(), y.min(), y.max()])
plt.colorbar()
plt.show()

逆距離加重補間もあります-RBFに似ていますが、ポイントの数が多い場合により適切に機能するはずです: Inverse Distance Weighted (IDW) Interpolation with Python

于 2012-01-31T22:10:34.270 に答える