あなたの質問は少し定義が不十分です。まず、「高さ」軸は、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 にはvstack
、hstack
、および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]]])
末尾にゼロを追加したい場合は、スタック関数の呼び出しでパラメーターの順序を変更するだけです。