特定の軸に沿って異なる次元を持つ複数のnumpy配列をインターリーブしたいと思います。特に、最初の軸に沿って変化する shape の配列のリストがあり(_, *dims)
、これをインターリーブして shape の別の配列を取得したいと考えてい(_, *dims)
ます。たとえば、入力が与えられた場合、
a1 = np.array([[11,12], [41,42]])
a2 = np.array([[21,22], [51,52], [71,72], [91,92], [101,102]])
a3 = np.array([[31,32], [61,62], [81,82]])
interweave(a1,a2,a3)
望ましい出力は
np.array([[11,12], [21,22], [31,32], [41,42], [51,52], [61,62], [71,72], [81,82], [91,92], [101,102]]
以前の投稿 ( Numpy concatenate arrays with interleavingなど) の助けを借りて、配列が最初の次元に沿って一致するときにこれが機能するようになりました。
import numpy as np
def interweave(*arrays, stack_axis=0, weave_axis=1):
final_shape = list(arrays[0].shape)
final_shape[stack_axis] = -1
# stack up arrays along the "weave axis", then reshape back to desired shape
return np.concatenate(arrays, axis=weave_axis).reshape(final_shape)
残念ながら、入力形状が最初の次元に沿って一致しない場合、一致しない軸とは異なる軸に沿って連結する必要があるため、上記は例外をスローします。実際、一致しない軸に沿って連結すると、目的の出力を生成するために必要な情報が破壊されるため、連結を効果的に使用する方法はありません。
もう 1 つのアイデアは、入力配列の形状が最初の次元に沿って一致するまで null エントリでパディングし、1 日の終わりに null エントリを削除することでした。これは機能しますが、どのように実装するのが最善かはわかりません。そもそも必要ではないようです。