1

間隔で定義された立方体グリッドがありますxi,yi,zi:

xi,yi,zi = [linspace(ox,ox+s*d,s) for ox,s,d in zip(origin,size,delta)]

Wそのグリッドにスカラー値のセットもあります。W.shape() == size. 入力として必要な scipy の線形補間を使用したいと思います。

クラスscipy.interpolate.LinearNDInterpolator(points, values):

パラメーター :

points: float の ndarray、形状(npoints, ndims)データ ポイントの座標。

values: float または複雑な形状の(npoints, ...)データ値の ndarray。

pointsから(魔法のブロードキャストを介して)の偽のセットを作成するにはどうすればよいxi,yi,ziですか?現在、補間関数に供給する中間配列を作成しています - より良い方法はありますか?

関連する質問: 3D の Numpy meshgrid。この投稿の回答は実際にグリッドを作成します-別の関数への入力としてシミュレートしたいだけです(純粋なnumpyソリューションが推奨されます)。

4

3 に答える 3

3
>>> xi, yi, zi = [np.arange(3) for i in range(3)]
>>> xx, yy, zz = np.broadcast_arrays(xi,yi[:,np.newaxis],zi[:,np.newaxis,np.newaxis])
>>> xx.shape
(3, 3, 3)
>>> xx.strides
(0, 0, 8)

最初の 2 つの次元でストライドが 0 であるため、新しいコピーが作成されていないことがわかります。

これの次元バージョンも書きました:

def ndmesh(*args):
   args = map(np.asarray,args)
   return np.broadcast_arrays(*[x[(slice(None),)+(None,)*i] for i, x in enumerate(args)])
于 2012-08-16T20:55:24.200 に答える
1

points他の回答で説明されているのと同様の方法で、必要な配列を構築できます。

xx, yy, zz = np.broadcast_arrays(xi[:,None,None], yi[None,:,None], zi[None,None,:])
points = (xx.ravel(), yy.ravel(), zz.ravel())
ip = LinearNDInterpolator(points, data.ravel())

ただし、通常のグリッドを使用しているLinearNDInterpolator場合は、散在するデータの補間用に設計されているため、使用することはおそらく最良の選択ではありません。データ ポイントの Delaunay 三角形分割を作成しますが、この場合、元のデータは既に非常に規則的な構造を持っているため、より効率的に使用できます。

グリッドは長方形なので、3 つの 1 次元補間のテンソル積として補間を構築できます。Scipy にはこれが組み込まれていませんが (今のところ)、かなり簡単に実行できます。次のスレッドを参照してください: http://mail.scipy.org/pipermail/scipy-user/2012-June/032314.html (使用たとえば、1-D 補間を取得するには、pchip の代わりに interp1d を使用します)

于 2012-08-19T14:48:49.660 に答える
0

完全なコピー以外に LinearNDInterpolator に何かを渡す方法はないと思います (3 次元の通常のグリッドにも関数がないため)。したがって、完全な配列の作成を回避する唯一の場所は、このポイント配列の作成中です。現在どのように行うかはわかりません。この点ではすでに効率的かもしれませんが、回避するのに苦労する価値はないと思います。これ。

それ以外の np.mgrid+reshape は、おそらくこのようなものがオプションになる可能性があります(n次元についても書くのは難しくありません):

# Create broadcastest versions of xi, yi and zi
# np.broadcast_arrays does not allocate the full arrays
xi, yi, zi = np.broadcast_arrays(xi[:,None,None], yi[:,None,None], zi[:,None,None])

# then you could use .flat to fill a point array:
points = np.empty((xi.size, 3), dtype=xi.dtype)
points[:,0] = xi.flat
points[:,1] = yi.flat
points[:,2] = zi.flat

関数とは対照的に、.repeatここで作成される一時配列は、元の などの配列よりも大きくありません。xi

于 2012-08-16T16:48:54.603 に答える