1

高さ軸に沿っていずれかの方向に 3D numpy 配列をシフトできるようにしたいと考えています。たとえば 3 の正のシフトが指定された場合、配列内のすべての値が上にシフトし、ゼロの 3 つの新しいスライスが配列の下部に表示されます。負のシフトが与えられた場合、逆のことが起こり、すべてのスライスが高さ軸に沿って下にシフトし、ゼロの新しいスライスが上部に表示されます。

配列を 1D に再形成し、左右にシフトしてから 3D に戻そうとしました。ただし、これは配列を間違った方向にシフトします。再形成する前に numpy.rollaxis を実装しようとしたため、正しい軸に沿ってシフトしました。しかし、私が取り組んでいるシステムは、すべての numpy 関数を認識せず、rollaxis を実行しません。

ありがとう!

4

1 に答える 1

4

あなたの質問は少し定義が不十分です。まず、「高さ」軸は、3D 配列でどの軸を求めているかを明確に定義するものではありません。形状タプル内の位置によってそれらを見つける方がはるかに優れています。これを「最初の軸に沿って」という意味で使用しますが、別の軸に対してどのように行うかは明らかです。

第二に、シフトされたデータをゼロで埋める必要があることは明らかですが、反対側のデータで何をしたいのかを指定していません。配列の境界を越えて消えて失われる必要がありますか? それとも、すべてを保持するために配列を拡張する必要がありますか?

前者の場合、numpy にはroll関数があり、これは目的と同様ですが、ゼロで埋める代わりに、配列の反対側からデータをコピーします。後でこれをゼロに置き換えるだけです。

>>> a = np.arange(60).reshape(3, 4, 5)
>>> a
array([[[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14],
        [15, 16, 17, 18, 19]],

       [[20, 21, 22, 23, 24],
        [25, 26, 27, 28, 29],
        [30, 31, 32, 33, 34],
        [35, 36, 37, 38, 39]],

       [[40, 41, 42, 43, 44],
        [45, 46, 47, 48, 49],
        [50, 51, 52, 53, 54],
        [55, 56, 57, 58, 59]]])
>>> b = np.roll(a, 2, axis=0)
>>> b[:2,:, :] = 0
>>> b
array([[[ 0,  0,  0,  0,  0],
        [ 0,  0,  0,  0,  0],
        [ 0,  0,  0,  0,  0],
        [ 0,  0,  0,  0,  0]],

       [[ 0,  0,  0,  0,  0],
        [ 0,  0,  0,  0,  0],
        [ 0,  0,  0,  0,  0],
        [ 0,  0,  0,  0,  0]],

       [[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14],
        [15, 16, 17, 18, 19]]])

シフトが負の場合、代わりに を使用b[:shift, :, :] = 0しますb[-shift:, :, :] = 0

データを失いたくない場合は、基本的に配列の上部または下部にゼロのスライスを追加するだけです。最初の 3 つの次元については、numpy にはvstackhstack、およびdstackがあり、次vstackの 1 つである必要があります。

>>> a = np.arange(60).reshape(3, 4, 5)
>>> b = np.vstack((np.zeros((2,)+a.shape[1:], dtype=a.dtype), a))
>>> b
array([[[ 0,  0,  0,  0,  0],
        [ 0,  0,  0,  0,  0],
        [ 0,  0,  0,  0,  0],
        [ 0,  0,  0,  0,  0]],

       [[ 0,  0,  0,  0,  0],
        [ 0,  0,  0,  0,  0],
        [ 0,  0,  0,  0,  0],
        [ 0,  0,  0,  0,  0]],

       [[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14],
        [15, 16, 17, 18, 19]],

       [[20, 21, 22, 23, 24],
        [25, 26, 27, 28, 29],
        [30, 31, 32, 33, 34],
        [35, 36, 37, 38, 39]],

       [[40, 41, 42, 43, 44],
        [45, 46, 47, 48, 49],
        [50, 51, 52, 53, 54],
        [55, 56, 57, 58, 59]]])

末尾にゼロを追加したい場合は、スタック関数の呼び出しでパラメーターの順序を変更するだけです。

于 2013-04-09T14:58:10.823 に答える