他の投稿者が観察したように、J の配列アクセスは、主 (主要) 軸に向かって重み付けされます。つまり、J 言語では、配列の長さに沿って要素 (最初の項目、2 番目の項目、3 番目の項目など) を簡単にアドレス指定できます。
非主軸にアクセスするために、J プログラマーは通常、abstraktor と MPelletier のそれぞれの応答によって示されるように、2 つの戦略のいずれかを採用します。
対象の軸が実際に主軸になるように、配列を変更します。あなたの場合、を使用した抽象化のソリューションで示されているように、2 番目 (「列」) 軸を 1 番目 (「行」) 軸に変換することによって|:
。
または、アクセサー関数のパースペクティブを変更して、対象の軸がそのアクセサーの視点から主要な軸のように見えるようにします。{
これは、ランク()を使用して(この場合はアクセサ関数)の視点を変更する MPelletier のソリューションによって例示されます"
。彼の例では、POV は{
一度に 1 つの行に制限されているため、その関数の観点から見ると、先頭の軸は各行のアトムです。これは、集約すると (もちろん) 列に対応します。
したがって、これらは J で非主要軸にアクセスするための主要な方法です。そうは言っても、特定のプリミティブ関数は実際には非主要軸を直接アドレス指定できます。実際、{
引数を正しくフォーマットすると、次のいずれかになります。
(<a:;1) { v
+--+--+--+--+
|y1|y2|y3|y1|
+--+--+--+--+
ここでは、ボックス化された左の引数を に渡しています{
。これを行うと、 は{
、そのボックス自体がボックスのリストを含むことを理解します: 軸ごとに 1 つのボックス (item-in-the-shape-of) の右側の引数。これらの (サブ) ボックスのそれぞれは、右側の引数の対応する軸の選択基準を示します。ここでは、" a:
" を使用して最初の軸の "a"ll を示し、1 を使用して 2 番目の軸の 2 番目の要素 (つまり、2 番目の列) を示しています。「2 番目と 3 番目の行の最初と最後の列」のように、組み合わせることもできます。
(<1 2;0 _1) { v
+--+--+
|x2|z2|
+--+--+
|x3|z3|
+--+--+
もちろん、これは明らかな方法で N 次元配列に拡張されます。
{
したがって、配列の先頭以外の軸を直接アドレス指定するために使用できます。他の特定のプリミティブはこの機能を共有しますが、もちろん、アドレス指定された軸で定義された機能を実行します (データを選択するだけの場合は、 を使用します{
)。
より一般的な行ではなく、列に配列をカット (分割) したいとしましょう。;.
次に、 ( cut )を使用できますが、通常のオープン LHA の代わりにボックス化された左側の引数を使用します。
('';1) <;.1 v
+----+----+----+
|+--+|+--+|+--+|
||x1|||y1|||z1||
|+--+|+--+|+--+|
||x2|||y2|||z2||
|+--+|+--+|+--+|
||x3|||y3|||z3||
|+--+|+--+|+--+|
||x1|||y1|||z1||
|+--+|+--+|+--+|
+----+----+----+
実際、この方法を使用して複数の軸を同時に扱うことができます。たとえば、配列を列ごとに分割された行のペアにグループ化できます (つまり、2x1 サブ配列に)。
(1 0 1 0;1) <;.1 v
+----+----+----+
|+--+|+--+|+--+|
||x1|||y1|||z1||
|+--+|+--+|+--+|
||x2|||y2|||z2||
|+--+|+--+|+--+|
+----+----+----+
|+--+|+--+|+--+|
||x3|||y3|||z3||
|+--+|+--+|+--+|
||x1|||y1|||z1||
|+--+|+--+|+--+|
+----+----+----+
または、列を選択する代わりに、一部を削除したいとしましょう。次に、通常のスカラーの代わりにベクトル LHA で}.
( drop ) を使用できます。
0 1 }. v NB. Keep all the rows but drop the first column
+--+--+
|y1|z1|
+--+--+
|y2|z2|
+--+--+
|y3|z3|
+--+--+
|y1|z1|
+--+--+
2 _1 }. v NB. drop the first two rows and the last column
+--+--+
|x3|y3|
+--+--+
|x1|y1|
+--+--+
同様に{.
(テイク):
_ 1 {. v NB. Take all the rows (_=∞) but only 1 column (the first)
+--+
|x1|
+--+
|x2|
+--+
|x3|
+--+
|x1|
+--+
同様に、ベクトル LHA to |.
( rotate ) を使用すると、配列の任意の次元 (または次元) を前後に回転させることができます: 2 つの場所_2 |. v
の行を回転させますが、列を1 つの場所 (後方) に回転させます。両方を実行します (つまり、左上隅は "y3" になります)。v
0 1 |. v
_2 1 |. v
ベクトル LHA では、transpose で軸の任意のコレクションをアドレス指定し、それらすべてを一度に配列の後ろに移動 (つまり、転置) することもできます。
$ 1 2 |: i. 11 22 33 44 NB. Transpose the middle dimensions to the end
11 44 22 33
$ 1 2 0 3 |: i. 11 22 33 44 NB. Mix up all dimensions
22 33 11 44
等
要約すると、J 言語は「主要な軸」(つまり最初の軸) について簡単に話せるように設計されています。実際には、これが最も一般的な使用例だからです。副軸について話すには、通常、配列を物理的に反転して ( を使用|:
)、目的の軸を前面に出すか、関数の視点を変更"
して ( を使用)、その関数のポイントから同等の効果を得ます。ビューの。
さらに、必要に応じて、J は、上記で詳述したように、非主要軸に直接対処するための特定の組み込みツールを提供します。
注: 例を単純にするために、前の説明では単数形の「関心軸」というフレーズを使用しました。しかし、J の配列指向の性質を考えると、"関心のある axEs" (複数形) というフレーズを使用する方が正確です。この意味で、単数形を複数形に置き換えることは、一般性を失うことなく、与えられた散文と例の両方に対して行うことができます(実際、それを得る:言語は配列で考える、つまり同時に複数の次元に関して考えるのを奨励します)。