Dyadic Devrik


9

Çoğu APL sembolünde olduğu gibi, bir argümanla (devrik) çağrıldığında iki argümanla (ikili devrik / yeniden sıralama boyutları) çağrıldığında farklı anlamlar vardır. Bu zorluk numpy.moveaxis, Python veya permuteMATLAB'da benzer şekilde hareket eden ancak daha güçlü olan ikincisi ile ilgilidir .

order ⍉ Ane zaman orderfarklı girişler var

Tüm üyeleri orderfarklı olduğunda order ⍉ A, şuna eşittir:

  • numpy.moveaxis(A, tuple(range(len(A.shape)), order) Python'da veya
  • permute(A,order)MATLAB. İkincisinin belgelerinden alıntı :

B = permute (A, order), A'nın boyutlarını vektör sırası tarafından belirtilen sırada olacak şekilde yeniden düzenler. Elde edilen B dizisi A ile aynı değerlere sahiptir, ancak herhangi bir belirli öğeye erişmek için gereken aboneliklerin sırası, siparişte belirtildiği gibi yeniden düzenlenir.

Örneğin, diyelim Aki bir 3B dizi ve diyelim B ← (2 0 1)⍉A. O zaman B öyle ki B[x0,x1,x2] = A[x2,x0,x1], herkes içinx2,x0,x1

order ⍉ Aordertekrarlanan girişler ne zaman

orderTekrarlanan girişler olduğunda , dizinin çapraz dilimini alırız. Örneğin, A 2x3x4 dizisi olsun. böyle B ← (0 0 1)⍉Açapraz bir dilim Aoluşturur . Bir 2x4 dizisi olduğunu unutmayın : 3x4 olsaydı, sınırlarının dışında olacağını ayarlamamız gerekirdi . Genel olarak bunun boyutu , tüm bu boyutların en azı olacaktır .BB[x0,x1] = A[x0,x0,x1]BB[2, x1] = A[2, 2, x1]AkBA.shape[i]order[i] = k

Misal

A'nın 3x4x5 order⍉Aolduğu ikili order = [2, 1, 0]devri düşünün

    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]]]

Sonuç 5x4x3 dizisi 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]]]

Örneğin, (x0, x1, x2) = (4,1,2) 'e sahip olduğumuzu unutmayın B[x0,x1,x2] = A[x2, x1, x0] = A[2,1,4] = 49.

Bunun yerine order = [0, 0, 0]ve Ayukarıdaki gibi, o zaman çıktı B1 boyutlu boyut-3 dizi olacaktı B = [0, 26, 52]kiB[1] = B[x0] = A[x0,x0,x0] = A[1,1,1] = 26

Giriş

Burada 0-endeksleme kullanıyoruz, ancak APL varsayılanı olarak 1-endeksleme de kullanabilirsiniz.

  • N ≥ 1 Aboyutunda çok boyutlu veya iç içe dizi .

  • Bir liste orderait n tamsayılar oluşan pozitif tamsayılar {0,1, ..., k} (veya {1, ..., k + 1} 1-endeksi için) bazıları için k < n muhtemelen herhangi bir sırada, tekrarlamalarla.

Çıktı

  • Bu argümanlarla ikili dönüşümün uygulanmasının sonucunu temsil eden çok boyutlu veya iç içe dizi. (Çıktı k + 1 boyutuna sahip olacaktır .)

Mevcut standardın metada izin verdiği şekilde tam bir program, işlev vb. Yazabilirsiniz.

Dilinizde bir yerleşik varsa, ilginç bir cevap uğruna yerleşik olmadan bir çözüm yazmanız da önerilir.

Test senaryoları

TIO'daki test senaryoları

Referans Python uygulaması yakında.

Test senaryolarını okumak için not: APL'de, bir dizinin sondan bir önceki ve son eksenleri bu sırayla sütunlar ve satırlar boyunca bulunur.


4
APL, 1 bayt:: P
Quintec

1
Aslında, birçok APL sembolü yalnızca bir argümanla çağrıldığında varsayılan bir ikinci argüman kullanır. Bu içerir , böylece varsayılan olarak ters eksen indisleri kullanan ⍉Aaynı (2 1 0)⍉Aise Abir 3-boyutlu bir dizidir ve genel olarak ⍉Aise (⌽⍳≢⍴A)⍉A.
Adam

@lirtosiast i / o ile ilgili soru: çok boyutlu bir dizi bir şekil (boyut listesi) ve içerik (indekslerin sözlükbilimsel düzenindeki tüm öğeler) çifti olarak temsil edilebilir mi?
ngn

@ngn şimdilik hayır derdim ama sen üzerinde sormalısınız meta o biçim varsayılan olarak kabul edilebilir olup olmadığı.
lirtosiast

@lirtosiast Anekdot olarak, Dyalog APL dizileri dahili olarak depolar [number-of-dimensions,first-dimension-length,second-dimension-length,…,last-dimension-length,first-element,second-element,…,last-element].
Adam

Yanıtlar:


4

APL (Dyalog Unicode) , 34 bayt SBCS

Bu benim meslektaşımın kodu ( Roger Hui'den hafifçe değiştirildi : 50 Fonksiyonda APL'nin Tarihi , bölüm 30 ), açık izinle gönderildi.

Anonim taklit infix lambda (için damla olarak kullanılabilir ).

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

Çevrimiçi deneyin!

{} Dfn; sol argüman (eksen), sağ argüman (dizi)
Eg [2,2,1]ve[[[1,2],[3,4]]]

⍵[] Diziyi şununla dizin:

  (⍴⍵)[] Dizinin şekli (eksen uzunlukları), dizine eklenir:
  [1,2,2]

   ⍋⍺ eksenlerin derecelendirme vektörü (onları sıralayacak indeksler)
   [3,1,2]
  [2,1,2]

  ⍺[⍋⍺]{}⌸ Sıralanan eksenleri bunu gruplamak için anahtar olarak kullanın ve her grup için:
  [1,2,2]{"1":[2],"2":[1,2]}

   {⌊/⍵} en düşük eksen uzunluğunu bul
   {"1":2,"2":1}[2,1]

   bu boyutlardaki Kartezyen bir sistemde endeksler oluşturabilir
  [[[1,1]],[[2,1]]]

   her koordinatın indekslerinin bir vektör olduğundan emin olun (eğer bir vektör ise skaler olacaktır )
  [[[1,1]],[[2,1]]]

  ()⌷¨ Aşağıdakilerin her birine indeksleyin:

   ⊂⊂⍺ eksenler (iki kere kapalı; ilk ve tek eksen boyunca bu hücreleri seçmek için bir kez ve ¨sağdaki her vektörü soldaki tüm eksen seti ile eşleştirmek için bir kez )
   2 1 2
  [[[1,1,1]],[[1,2,1]]]
[[1],[3]]

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.