이항 조옮김


9

대부분의 APL 기호와 마찬가지로 하나의 인수 (전치)와 두 개의 인수 (이항 전치 / 재주문 차원)로 호출 할 때 다른 의미를 갖습니다. 이 과제는 후자에 관한 것으로, numpy.moveaxis파이썬이나 permuteMATLAB 에서 와 비슷하게 작동 하지만 더 강력합니다.

order ⍉ Aorder별개의 항목이 있을 때

의 모든 구성원 order이 고유 order ⍉ A하면 다음과 같습니다.

  • numpy.moveaxis(A, tuple(range(len(A.shape)), order) 파이썬에서, 또는
  • permute(A,order)MATLAB에서. 후자의 문서 에서 인용 :

B = permute (A, order)는 A의 차원을 벡터 순서로 지정된 순서대로 재정렬합니다. 결과 배열 B의 값은 A와 같지만 특정 요소에 액세스하는 데 필요한 아래 첨자의 순서는 순서대로 지정됩니다.

예를 들어 A3D 배열 이라고 가정 하고 let 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만들어 B냅니다 B[x0,x1] = A[x0,x0,x1]. 참고 B가 3 × 4 인 경우에, 우리가 설정해야 할 것 : 2 × 4의 배열 B[2, x1] = A[2, 2, x1]의 범위를 벗어 될 것이다 A. 일반적으로의 k차원은 그와 같은 B것의 최소치입니다 .A.shape[i]order[i] = k

이항 트랜스을 고려 order⍉A경우 order = [2, 1, 0]A는 3x4x5이고

    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상기와 같이, 우리는 출력했을 B1 차원 크기 -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의 테스트 사례

곧 파이썬 구현을 참조하십시오.

테스트 사례를 읽기위한 참고 사항 : APL에서 배열의 끝과 끝 축은 순서대로 열과 행을 따릅니다.


4
APL, 1 바이트 : : P
Quintec

1
실제로, 많은 APL 심볼은 하나의 인수로 호출 될 때 기본 두 번째 인수 만 사용합니다. 여기에는 역축 인덱스를 기본값으로 사용하는 것이 포함 되므로 3 차원 배열 인 경우 ⍉A와 동일하며 일반적으로 입니다 . (2 1 0)⍉AA⍉A(⌽⍳≢⍴A)⍉A
Adám

i / o에 대한 질문 : 다차원 배열을 한 쌍의 모양 (차원 목록)과 내용 (모든 요소를 ​​사전 순서대로 색인으로 표시) 할 수 있습니까?
ngn

@ngn 지금은 '아니요'라고 말하지만 메타 에서 기본적으로 해당 형식을 사용할 수 있는지 묻습니다 .
lirtosiast

@lirtosiast 일화 적으로 Dyalog APL은 내부적으로 배열을로 저장합니다 [number-of-dimensions,first-dimension-length,second-dimension-length,…,last-dimension-length,first-element,second-element,…,last-element].
Adám

답변:


4

APL (Dyalog Unicode) , 34 바이트 SBCS

이것은 내 동료 의 코드입니다 ( Roger Hui 에서 약간 수정되었습니다 : 50 기능의 APL , 30 장 ).

익명의 암묵적 람다 람다 (에 대한 드롭 인으로 사용할 수 있음 ).

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

온라인으로 사용해보십시오!

{} dfn; 왼쪽 인수 (축)이고 오른쪽 인수 (배열)입니다.
Eg [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]]]

  ()⌷¨ 다음을 가진 각 항목에 색인을 작성하십시오.

   ⊂⊂⍺ 좌표축 (두 개로 묶음 , 첫 번째 축과 유일한 축을 따라 해당 셀을 선택하기 ¨위해 한 번 , 오른쪽의 각 벡터를 왼쪽의 전체 축 세트와 쌍을 이루기 위해 한 번 )
   2 1 2
  [[[1,1,1]],[[1,2,1]]]
[[1],[3]]

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.