は、出力がn次元 ( m 1 × m 2 … × m n ) 配列でf
ある 1 つのパラメーターの関数であり、要素がすべて の有効な引数である長さkのベクトルであるとします。B
f
によって得られる ( n +1) 次元 ( m 1 × m 2 ×…× m n × k ) 配列を生成するための、便利で、さらに重要なことに、「形状にとらわれない」MATLAB 式 (またはレシピ) を探しています。 k n次元配列を「積み重ねる」 。
f(b)
パラメータのb
範囲はB
.
でこれを行うにはnumpy
、次のような式を使用します。
C = concatenate([f(b)[..., None] for b in B], -1)
なんらかの用途がある場合に備えて、この numpy 式を以下に展開します ( APPENDIXを参照)。ただし、ここで強調したい特徴は、およびの形状/サイズに完全に依存しないことです 。私が考えている種類のアプリケーションでは、このような「形状にとらわれない」コードを記述できることが最も重要です。(この種の操作を行うために遭遇する多くの MATLAB コードは明らかに「形状にとらわれない」ものではなく、そのようにする方法がわからないため、この点を強調します。)f(b)
B
付録
一般に、A
が numpy 配列である場合、式A[..., None]
は "再形成" と見なすことができるA
ため、1 つの追加の些細な次元が取得されます。したがって、f(b)
がn次元 ( m 1 × m 2 … × m n ) 配列の場合、f(b)[..., None]
は対応する ( n +1) 次元 ( m 1 × m 2 ×…× m n × 1) 配列です。(この些細な次元を追加する理由は、以下で明らかになります。)
この説明はさておき、 の最初の引数の意味は次のconcatenate
とおりです。
[f(b)[..., None] for b in B]
解読するのはそれほど難しくありません。これは標準的な Python の "リスト内包表記" であり、パラメーターが vector の範囲にあるため、 k ( n +1) 次元 ( m 1 × m 2 ×…× m n × 1) 配列のシーケンスに評価されます。f(b)[..., None]
b
B
の 2 番目の引数concatenate
は、連結が実行される "軸" であり、連結される配列の対応する次元のインデックスとして表されます。end
このコンテキストでは、インデックス -1は、MATLAB でのキーワードと同じ役割を果たします。したがって、式
concatenate([f(b)[..., None] for b in B], -1)
f(b)[..., None]
「最後の次元に沿って配列を連結する」と言います。この「最後の次元」を連結するためには、配列を再形成する必要がありf(b)
ます (たとえば、f(b)[..., None]
)。