1

私は現在、おおよそ100x120の2D numpyマトリックスを持っています。インデックスは「座標」を参照し、マトリックスの値は「高さ」です。ここに示す「2 次元スプライン表現」と同様の pcolor を使用して、このデータをプロットしようとしています。

http://docs.scipy.org/doc/scipy-0.7.x/reference/tutorial/interpolate.html

私の問題は、すべての「座標」と「高さ」が整数であるにもかかわらず、座標が等間隔ではないことです。たとえば、特定の行のみにデータが含まれ (等間隔ではない)、データを含む各行には、他のすべてのエントリの "高さ" 値のみが含まれます (データを含む各行の間隔は同じです)。私が意味することの簡単な例は次のとおりです。

[[nan,   3, nan,   1, nan,   2], 
 [nan, nan, nan, nan, nan, nan],
 [nan,   5, nan,   2, nan,   3],
 [nan, nan, nan, nan, nan, nan],
 [nan, nan, nan, nan, nan, nan],
 [nan, nan, nan, nan, nan, nan],
 [nan,   4, nan,   1, nan,   2]]

リンク先の補間/pcolor の例に従おうとしましたが、成功しませんでした。私の目標は、すべてのデータに対して適切な連続 pcolor タイプのプロットを作成し、ポイント間をデータで補間してそれらの nan を埋めることです。

ご提供いただけるご支援をいただければ幸いです。

4

1 に答える 1

4

どうしたの?値を使用してセルのインデックスを抽出し、それらを「height」値を使用して補間関数に渡す必要があります。これを行うコードが以下にあります。

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

a = np.array([[nan,   3, nan,   1, nan,   2], 
 [nan, nan, nan, nan, nan, nan],
 [nan,   5, nan,   2, nan,   3],
 [nan, nan, nan, nan, nan, nan],
 [nan, nan, nan, nan, nan, nan],
 [nan, nan, nan, nan, nan, nan],
 [nan,   4, nan,   1, nan,   2]])

x, y = np.where(np.isfinite(a))
z = a[x,y]

xnew,ynew = np.mgrid[0:6:70j,0:6:70j]
tck = interpolate.bisplrep(x,y,z,s=0, kx=1, ky=1)
znew = interpolate.bisplev(xnew[:,0],ynew[0,:],tck)

plt.figure()
plt.pcolor(xnew,ynew,znew)
plt.colorbar()
plt.title("Interpolated function.")
plt.show()

結果は次のようになります。

ここに画像の説明を入力してください

これは、マトリックスの正確な方向と一致しないことに注意してください。そのためには、プロットの原点を左上隅に変更し、場合によってはデータを転置する必要があります。演習としてお任せします。

また、na以外の値のインデックスを取得する方法は少し粗雑なので、おそらく他の誰かがそれについてコメントする可能性があります(ヒントを提供してくれたsebergに感謝します)。

于 2012-10-23T15:21:21.260 に答える