21

2D データを通常のグリッドにリサンプリングする必要があります。

これは私のコードがどのように見えるかです:

import matplotlib.mlab as ml
import numpy as np

y = np.zeros((512,115))
x = np.zeros((512,115))

# Just random data for this test:
data = np.random.randn(512,115)

# filling the grid coordinates:    
for i in range(512):
    y[i,:]=np.arange(380,380+4*115,4)

for i in range(115):
    x[:,i] = np.linspace(-8,8,512)
    y[:,i] -=  np.linspace(-0.1,0.2,512)

# Defining the regular grid
y_i = np.arange(380,380+4*115,4)
x_i = np.linspace(-8,8,512)

resampled_data = ml.griddata(x,y,data,x_i,y_i)

(512,115) は 2D データの形状で、既に mpl_toolkits.natgrid をインストールしています。

私の問題は、ほとんどが通常のエントリで構成され、境界で nan だけで構成される配列ではなく、ほとんどのエントリが nan であるマスクされた配列を取得することです。

誰かが私が間違っていることを教えてもらえますか?

ありがとう!

4

1 に答える 1

75

コード例と質問のタイトルを比較すると、少し混乱していると思います...

サンプル コードでは、規則的にグリッド化されたランダム データを作成し、それを別の規則的なグリッドにリサンプリングしています。例のどこにも不規則なデータはありません...

(また、コードはそのままでは実行されないためmeshgrid、ループして x & y グリッドを生成するのではなく、調べる必要があります。)

例のように、すでに定期的にサンプリングされているグリッドを再サンプリングしたい場合は、griddata または以下で説明するものよりも効率的な方法があります。(scipy.ndimage.map_coordinatesその場合、あなたの問題に適しています。)

ただし、質問に基づいて、規則的なグリッドに補間したい不規則な間隔のデータがあるようです。

その場合、次のようなポイントがあるかもしれません。

import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt

# Bounds and number of the randomly generated data points
ndata = 20
xmin, xmax = -8, 8
ymin, ymax = 380, 2428

# Generate random data
x = np.random.randint(xmin, xmax, ndata)
y = np.random.randint(ymin, ymax, ndata)
z = np.random.random(ndata)

# Plot the random data points
plt.scatter(x,y,c=z)
plt.axis([xmin, xmax, ymin, ymax])
plt.colorbar()
plt.show()

ランダムに生成されたデータ

その後、以前と同じようにデータを補間できます... (上記のコード スニペットの続き...)

# Size of regular grid
ny, nx = 512, 115

# Generate a regular grid to interpolate the data.
xi = np.linspace(xmin, xmax, nx)
yi = np.linspace(ymin, ymax, ny)
xi, yi = np.meshgrid(xi, yi)

# Interpolate using delaunay triangularization 
zi = mlab.griddata(x,y,z,xi,yi)

# Plot the results
plt.figure()
plt.pcolormesh(xi,yi,zi)
plt.scatter(x,y,c=z)
plt.colorbar()
plt.axis([xmin, xmax, ymin, ymax])
plt.show()

補間が不十分なデータ

ただし、グリッドに多くのアーティファクトが表示されていることに気付くでしょう。これは、x 座標が -8 から 8 の範囲であり、y 座標が ~300 から ~2500 の範囲であるという事実によるものです。補間アルゴリズムは物事を等方的にしようとしますが、非常に異方性の補間が必要な場合があります (グリッドがプロットされたときに等方的に見えるようにするため)。

これを修正するには、補間を行うための新しい座標系を作成する必要があります。これを行う正しい方法は 1 つではありません。以下で使用しているものは機能しますが、「最良の」方法は、データが実際に表すものに大きく依存します。

(つまり、データが測定しているシステムについて知っていることを使用して、それを行う方法を決定します。これは常に補間の場合に当てはまります!結果がどのように見えるかを知っていない限り、補間を行うべきではなく、十分に精通している必要があります。アプリオリな情報を有利に使用するための補間アルゴリズム!! griddata がデフォルトで使用する Delaunay 三角形分割よりもはるかに柔軟な補間アルゴリズムもありますが、単純な例では問題ありません...)

とにかく、これを行う 1 つの方法は、x 座標と y 座標を再スケーリングして、それらがほぼ同じ大きさになるようにすることです。この場合。それらを0から1に再スケーリングします...(スパゲッティ文字列コードを許してください...これは例として意図しているだけです...)

# (Continued from examples above...)
# Normalize coordinate system
def normalize_x(data):
    data = data.astype(np.float)
    return (data - xmin) / (xmax - xmin)

def normalize_y(data):
    data = data.astype(np.float)
    return (data - ymin) / (ymax - ymin)

x_new, xi_new = normalize_x(x), normalize_x(xi)
y_new, yi_new = normalize_y(y), normalize_y(yi)

# Interpolate using delaunay triangularization 
zi = mlab.griddata(x_new, y_new, z, xi_new, yi_new)

# Plot the results
plt.figure()
plt.pcolormesh(xi,yi,zi)
plt.scatter(x,y,c=z)
plt.colorbar()
plt.axis([xmin, xmax, ymin, ymax])
plt.show()

正規化された座標系で補間されたデータ

とにかく、それが役に立てば幸いです...答えが長くなってすみません!

于 2010-10-05T20:08:36.380 に答える