この質問は、私が使用した最終的な解決策を表示するための回答の後に編集されました
例のように、さまざまなソースからの非構造化 2D データセットが
あります。これらの
データセットは 3 numpy.ndarray (X、Y 座標、Z 値) です。
私の最終的な目的は、これらのデータをグリッド上で補間して、画像/マトリックスに変換することです。したがって、これらのデータを補間するための「最適なグリッド」を見つける必要があります。そして、そのためには、そのグリッドのピクセル間の最適な X と Y のステップを見つける必要があります。
ポイント間のユークリッド距離に基づいてステップを決定する:
各点とその最も近い点の間のユークリッド距離の平均を使用します。
- X,Y データの構築ツリーには scipy.spacial の
KDTree
/を使用します。cKDTree
query
メソッドを使用しk=2
て距離を取得します ( の場合k=1
、各ポイントのクエリがそれ自体を検出したため、距離はゼロになります)。
# Generate KD Tree
xy = np.c_[x, y] # X,Y data converted for use with KDTree
tree = scipy.spacial.cKDTree(xy) # Create KDtree for X,Y coordinates.
# Calculate step
distances, points = tree.query(xy, k=2) # Query distances for X,Y points
distances = distances[:, 1:] # Remove k=1 zero distances
step = numpy.mean(distances) # Result
パフォーマンスの調整:
scipy.spatial.cKDTree
and notを使用すると、scipy.spatial.KDTree
実際に高速になるためです。balanced_tree=False
組み合わせて使用scipy.spatial.cKDTree
: 私の場合は大幅に高速化されますが、すべてのデータに当てはまるとは限りません。- マルチスレッドを使用する
n_jobs=-1
には withを使用します。cKDTree.query
- ユークリッド距離 ( ) の代わりにマンハッタン距離を使用
p=1
するために使用: 高速ですが、精度が低くなる場合があります。cKDTree.query
p=2
- ポイントのランダムなサブサンプルのみの距離をクエリします。大規模なデータセットでは速度が大幅に向上しますが、精度と再現性が低下する可能性があります。
グリッド上の点を補間する:
計算されたステップを使用して、グリッド上のデータセット ポイントを補間します。
# Generate grid
def interval(axe):
'''Return numpy.linspace Interval for specified axe'''
cent = axe.min() + axe.ptp() / 2 # Interval center
nbs = np.ceil(axe.ptp() / step) # Number of step in interval
hwid = nbs * step / 2 # Half interval width
return np.linspace(cent - hwid, cent + hwid, nbs) # linspace
xg, yg = np.meshgrid(interval(x), interval(y)) # Generate grid
# Interpolate X,Y,Z datas on grid
zg = scipy.interpolate.griddata((x, y), z, (xg, yg))
ピクセルがイニシャル ポイントから遠すぎる場合は NaN を設定します。
初期 X、Y、Z データのポイントから遠すぎる (距離 > ステップ) グリッドのピクセルに NaN を設定します。以前に生成された KDTree が使用されます。
# Calculate pixel to X,Y,Z data distances
dist, _ = tree.query(np.c_[xg.ravel(), yg.ravel()])
dist = dist.reshape(xg.shape)
# Set NaN value for too far pixels
zg[dist > step] = np.nan