3

Numpy 配列dataには .... データがあります。Numpy 配列zには距離があります。data と z は同じ形状で、z の各点は data の対応する点が測定された距離です。さらに複雑なことに、ユーザーは 3、4、または 5 次元の data/z 配列を提供します。

1D numpy array の一連の距離にデータを補間したいと考えていますdists。データ構造のため、補間軸は常に最後から 2 軸です。つまり、配列が 3 次元の場合、補間軸は 0 です。配列が 4 次元の場合、補間軸は 1 などです。AFAICT では、すべての numpy/scipy 補間ルーチンは元の距離を 1D 配列で指定することを望んでいるため、データと z を距離に補間するのはやや複雑な作業のようです。 . これは私が持っているものです:

def dist_interp(data, z, dists):
    # construct array to hold interpolation results
    num_dims = len(data.shape)
    interp_axis = num_dims-3
    interp_shape = list(data.shape)
    interp_shape[interp_axis] = dists.shape[0]
    interp_res = np.zeros(shape=interp_shape)
    # depending on usage, data could have between 3 and five dimensions.
    # add dims to generalize.  I hate doing it this way.  Must be
    # some other way.
    for n in range(num_dims, 5) :
        data = np.expand_dims(data, axis=0)
        z = np.expand_dims(z, axis=0)
        interp_res = np.expand_dims(interp_res, axis=0)
    for m in range(data.shape[0]):
        for l in range(data.shape[1]):
            for j in range(data.shape[3]):
                for i in range(data.shape[4]):
                    interp_res[m,l,:,j,i]=(
                                  np.interp(dists,z[m,l,:,j,i],
                                            data[m,l,:,j,i]))
    # now remove extra "wrapping" dimensions
    for n in range(0,5-num_dims):
        interp_res = interp_res[0]
    return(interp_res)

これでうまくいくと思いますが、余分な「ラッピング」ダミー ディメンションを追加したり削除したりするのは非常に洗練されておらず、コードがまったくコンパクトではありません。より良いアイデアはありますか?ありがとう。

4

1 に答える 1

4

この種の状況の一般的な経験則として:

  1. 何かをしたい軸を形状タプルの最後に移動します
  2. 結果の配列を 2D に変形します
  3. この 2D 配列から新しい配列を作成します
  4. 新しいアレイで手順 2 と 1 を元に戻す

あなたの場合、次のようになります。

# Create some random test data
axis = -2
shape = np.random.randint(10, size=(5,))
data = np.random.rand(*shape)
data = np.sort(data, axis=axis)
z = np.random.rand(*shape)
dists = np.linspace(0,1, num=100)

data = np.rollaxis(data, axis, data.ndim)
new_shape = data.shape
data = data.reshape(-1, data.shape[-1])
z = np.rollaxis(z, axis, z.ndim)
z = z.reshape(-1, z.shape[-1])

out = np.empty(z.shape[:1]+dists.shape)
for o, x, f in zip(out, data, z):
    o[:] = np.interp(dists, x, f)

out = out.reshape(new_shape[:-1]+dists.shape)
out = np.rollaxis(out, -1, axis)
于 2013-10-16T19:37:51.173 に答える