ダイアディック転置


9

ほとんどのAPLシンボルと同様に、1つの引数(転置)と2つの引数(2進転置/次元の並べ替え)で呼び出された場合の意味は異なります。この課題は後者に関係します。後者は、numpy.moveaxisPythonまたはpermuteMATLAB と同様に動作しますが、より強力です。

order ⍉ Aorder異なるエントリがある場合

のすべてのメンバーorderが異なる場合order ⍉ Aは、次と同等です。

  • numpy.moveaxis(A, tuple(range(len(A.shape)), order) Python、または
  • permute(A,order)MATLABで。後者のドキュメントからの引用:

B = permute(A、order)は、ベクトルの順序で指定された順序になるようにAの次元を並べ替えます。結果の配列Bの値はAと同じですが、特定の要素にアクセスするために必要な添え字の順序は、orderで指定されたとおりに再配置されます。

たとえばA、3D配列であるとしB ← (2 0 1)⍉Aます。そして、Bは、そのようなことであるB[x0,x1,x2] = A[x2,x0,x1]すべてのためにx2,x0,x1

order ⍉ Aorderエントリが繰り返されたとき

orderがエントリを繰り返した場合、配列の対角スライスを取得します。たとえば、Aを2x3x4配列とします。そのようなものを作成するためにB ← (0 0 1)⍉A斜めのスライスをとりAます。これは2x4の配列であることに注意してください。3x4の場合は、の範囲外を設定する必要があります。一般的に、のth次元は、そのようなすべての最小値になります。BB[x0,x1] = A[x0,x0,x1]BB[2, x1] = A[2, 2, x1]AkBA.shape[i]order[i] = k

Aが3x4x5 order⍉Aである2項転置を考えorder = [2, 1, 0]ます。

    A =
[[[ 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]]]

結果は5x4x3配列B =

[[[ 0 20 40]
  [ 5 25 45]
  [10 30 50]
  [15 35 55]]

 [[ 1 21 41]
  [ 6 26 46]
  [11 31 51]
  [16 36 56]]

 [[ 2 22 42]
  [ 7 27 47]
  [12 32 52]
  [17 37 57]]

 [[ 3 23 43]
  [ 8 28 48]
  [13 33 53]
  [18 38 58]]

 [[ 4 24 44]
  [ 9 29 49]
  [14 34 54]
  [19 39 59]]]

とき、例えば、(X0、X1、X2)=(4,1,2)私たちが持っていることに注意してくださいB[x0,x1,x2] = A[x2, x1, x0] = A[2,1,4] = 49

代わりorder = [0, 0, 0]A、上記のように、出力Bが1次元のsize-3配列にB = [0, 26, 52]なるように、B[1] = B[x0] = A[x0,x0,x0] = A[1,1,1] = 26

入力

ここでは0インデックスを使用していますが、APLのデフォルトである1インデックスを使用することもできます。

  • 多次元またはネストされた配列Aの次元の、N ≥1。

  • リストorderN個の整数からなる正の整数{0,1、...、K}(または{1、...、K + 1} 1-インデックスの)いくつかのために、K < N、おそらく任意の順序で、繰り返しあり。

出力

  • これらの引数を使用して2進転置を適用した結果を表す多次元またはネストされた配列。(出力の次元はk + 1になります。)

メタの現在の標準で許可されているように、完全なプログラム、関数などを書くことができます。

言語にビルトインがある場合は、興味深い答えを得るために、ビルトインのないソリューションも作成することをお勧めします。

テストケース

TIOのテストケース

リファレンスPythonの実装は近日公開予定です。

テストケースの読み取りに関する注意:APLでは、配列の最後から2番目と最後の軸は、列と行の順に並んでいます。


4
APL、1バイト::P
Quintec、2018年

1
実際、多くのAPLシンボルは、1つの引数で呼び出されると、デフォルトの2番目の引数を使用します。これには、デフォルトとして逆軸インデックスを使用するものが含まれるため⍉A(2 1 0)⍉Aif Aが3次元配列である場合と同じであり、一般的に⍉A(⌽⍳≢⍴A)⍉Aです。
アダム

@lirtosiast i / oに関する質問:多次元配列は、形状(次元のリスト)とコンテンツ(インデックスの辞書式順序のすべての要素)のペアとして表すことができますか?
ngn '19年

@ngn私は今のところノーと言いますが、そのフォーマットがデフォルトで受け入れられるかどうかメタで尋ねるべきです。
リルトシアスト

@lirtosiast事例として、Dyalog APLは配列を内部的にとして格納します[number-of-dimensions,first-dimension-length,second-dimension-length,…,last-dimension-length,first-element,second-element,…,last-element]
アダム

回答:


4

APL(Dyalog Unicode)、34 バイトSBCS

これは私の同僚のコード(Roger HuiA History of APL in 50 FunctionsChapter 30)から少し変更されており、明示的な許可を得て投稿されています。

匿名の暗黙的な中置ラムダ(のドロップインとして使用できます)。

{⍵[(⊂⊂⍺)⌷¨,¨⍳⍺[⍋⍺]{⌊/⍵}⌸(⍴⍵)[⍋⍺]]}

オンラインでお試しください!

{} dfn; 引数(軸)を残され、ある右引数(配列)
例:[2,2,1][[[1,2],[3,4]]]

⍵[] 配列に次のインデックスを付けます:

  (⍴⍵)[] インデックスが付けられた配列の形状(軸の長さ):
  [1,2,2]

   ⍋⍺ 軸のグレーディングベクトル(それらを並べ替えるインデックス)
   [3,1,2]
  [2,1,2]

  ⍺[⍋⍺]{}⌸ 並べ替えられた軸をキーとして使用してグループ化し、各グループごとに
  [1,2,2]{"1":[2],"2":[1,2]}

   {⌊/⍵} 最小軸長を見つける
   {"1":2,"2":1}[2,1]

   それらの次元のデカルト系でインデックスを生成する
  [[[1,1]],[[2,1]]]

   各座標のインデックスがベクトルであることを確認します(ベクトルの場合はスカラーになります)
  [[[1,1]],[[2,1]]]

  ()⌷¨ 以下のそれぞれに索引を付けます。

   ⊂⊂⍺ 軸(二重に囲まれています。1回目は最初の唯一の軸に沿ってこれらのセルを選択するため、もう1回¨は右側の各ベクトルを左側の軸のセット全体とペアにするためです)
   2 1 2
  [[[1,1,1]],[[1,2,1]]]
[[1],[3]]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.