Chuyển tuyến


9

Như với hầu hết các ký hiệu APL, có ý nghĩa khác nhau khi được gọi với một đối số (chuyển vị) so với hai đối số (kích thước chuyển vị / sắp xếp lại dyadic). Thách thức này liên quan đến cái sau, hoạt động tương tự như numpy.moveaxistrong Python hoặc permuteMATLAB, nhưng mạnh hơn.

order ⍉ Akhi ordercó mục riêng biệt

Khi tất cả các thành viên của orderlà khác biệt, order ⍉ Atương đương với:

  • numpy.moveaxis(A, tuple(range(len(A.shape)), order) trong Python, hoặc
  • permute(A,order)trong MATLAB. Trích dẫn từ tài liệu sau này:

B = permute (A, order) sắp xếp lại các kích thước của A sao cho chúng theo thứ tự được chỉ định bởi thứ tự vectơ. Mảng kết quả B có cùng giá trị với A nhưng thứ tự của các chỉ số cần thiết để truy cập bất kỳ phần tử cụ thể nào được sắp xếp lại theo quy định của đơn hàng.

Ví dụ: giả sử Alà một mảng 3D và cho phép B ← (2 0 1)⍉A. Sau đó, B là như vậy B[x0,x1,x2] = A[x2,x0,x1]cho tất cảx2,x0,x1

order ⍉ Akhi ordercó các mục lặp lại

Khi ordercó các mục lặp lại, chúng ta lấy một lát chéo của mảng. Ví dụ: Đặt A là mảng 2x3x4. B ← (0 0 1)⍉Amất một lát chéo Ađể tạo ra Bnhư vậy B[x0,x1] = A[x0,x0,x1]. Lưu ý rằng đó Blà một mảng 2x4: nếu là 3x4, chúng ta sẽ cần phải đặt B[2, x1] = A[2, 2, x1]ra ngoài giới hạn A. Nói chung, kchiều thứ của Bsẽ là tối thiểu của tất cả A.shape[i]như vậy order[i] = k.

Thí dụ

Hãy xem xét chuyển vị dyadic order⍉Atrong đó order = [2, 1, 0]và A là 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]]]

Kết quả là mảng 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]]]

Lưu ý rằng khi, ví dụ, (x0, x1, x2) = (4,1,2) chúng ta có B[x0,x1,x2] = A[x2, x1, x0] = A[2,1,4] = 49.

Nếu thay vào đó order = [0, 0, 0]Anhư trên, thì chúng ta sẽ có đầu ra Blà mảng kích thước 1 chiều 3 B = [0, 26, 52]sao choB[1] = B[x0] = A[x0,x0,x0] = A[1,1,1] = 26

Đầu vào

Ở đây chúng tôi sử dụng lập chỉ mục 0, nhưng bạn cũng có thể sử dụng lập chỉ mục 1 như mặc định của APL.

  • Một mảng nhiều chiều hoặc lồng nhau A, có kích thước n ≥ 1.

  • Một danh sách ordercủa n số nguyên dương gồm các số nguyên {0,1, ..., k} (hoặc {1, ..., k + 1} cho 1-index) đối với một số k < n , trong bất kỳ thứ tự, có thể với sự lặp lại.

Đầu ra

  • Một mảng đa chiều hoặc lồng nhau đại diện cho kết quả của việc áp dụng chuyển vị dyadic với các đối số đó. (Đầu ra sẽ có thứ nguyên k + 1. )

Bạn có thể viết một chương trình đầy đủ, chức năng, v.v. như được cho phép bởi tiêu chuẩn hiện tại trên meta.

Nếu ngôn ngữ của bạn có nội dung, bạn cũng nên viết một giải pháp mà không cần nội dung để có câu trả lời thú vị.

Các trường hợp thử nghiệm

Các trường hợp thử nghiệm trên TIO

Tham khảo triển khai Python sắp ra mắt.

Lưu ý khi đọc các trường hợp kiểm tra: trong APL, trục áp chót và cuối cùng của một mảng nằm dọc theo các cột và hàng theo thứ tự đó.


4
APL, 1 byte :: P
Quintec 17/11/18

1
Trên thực tế, nhiều biểu tượng APL chỉ sử dụng một đối số thứ hai mặc định khi được gọi với một đối số. Điều này bao gồm sử dụng các chỉ số trục đảo ngược làm mặc định, do đó, ⍉Agiống như (2 1 0)⍉Anếu Alà một mảng 3 chiều và nói chung ⍉A(⌽⍳≢⍴A)⍉A.
Adám

@lirtosiast câu hỏi về i / o: một mảng nhiều chiều có thể được biểu diễn dưới dạng một cặp hình dạng (danh sách các kích thước) và nội dung (tất cả các yếu tố theo thứ tự từ điển của các chỉ số của chúng) không?
ngn

@ngn Tôi sẽ nói không ngay bây giờ, nhưng bạn nên hỏi về meta xem định dạng đó có được chấp nhận theo mặc định không.
lirtosiast

@lirtosiast Giai thoại, Dyalog APL lưu trữ nội bộ mảng như [number-of-dimensions,first-dimension-length,second-dimension-length,…,last-dimension-length,first-element,second-element,…,last-element].
Adám

Câu trả lời:


4

APL (Dyalog Unicode) , 34 byte SBCS

Đây là mã của đồng nghiệp của tôi (được sửa đổi một chút từ Roger Hui : Lịch sử của APL trong 50 Chức năng , chương 30 ), được đăng với sự cho phép rõ ràng.

Ẩn danh infix lambda (có thể được sử dụng như là một phần bổ sung ).

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

Hãy thử trực tuyến!

{... } DFN; là đối số bên trái (trục), là đối số bên phải (mảng)
Eg [2,2,1][[[1,2],[3,4]]]

⍵[... ] chỉ số mảng với:

  (⍴⍵)[... ] hình dạng (độ dài của trục) của mảng, lập chỉ mục theo:
  [1,2,2]

   ⍋⍺ vectơ chấm điểm (các chỉ số sẽ sắp xếp chúng) của các trục
   [3,1,2]
  [2,1,2]

  ⍺[⍋⍺]{Các nhóm }⌸ sử dụng các trục được sắp xếp làm các khóa để nhóm và cho mỗi nhóm:
  [1,2,2]{"1":[2],"2":[1,2]}

   {⌊/⍵} tìm độ dài trục thấp nhất
   {"1":2,"2":1}[2,1]

   tạo các chỉ số trong một hệ thống Cartesian có các kích thước đó
  [[[1,1]],[[2,1]]]

   đảm bảo rằng các chỉ số của mỗi tọa độ là một vectơ (sẽ là vô hướng nếu là một vectơ)
  [[[1,1]],[[2,1]]]

  (... )⌷¨ chỉ số vào mỗi người với những điều sau đây:

   ⊂⊂⍺ các trục (được bao quanh gấp đôi; một lần để chọn các ô dọc theo trục đầu tiên và duy nhất và một lần ¨để ghép từng vectơ bên phải với toàn bộ các trục ở bên trái)
   2 1 2
  [[[1,1,1]],[[1,2,1]]]
[[1],[3]]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.