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.moveaxis
trong Python hoặc permute
MATLAB, nhưng mạnh hơn.
order ⍉ A
khi order
có mục riêng biệt
Khi tất cả các thành viên của order
là khác biệt, order ⍉ A
tương đương với:
numpy.moveaxis(A, tuple(range(len(A.shape)), order)
trong Python, hoặcpermute(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ử A
là 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 ⍉ A
khi order
có các mục lặp lại
Khi order
có 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)⍉A
mất một lát chéo A
để tạo ra B
như vậy B[x0,x1] = A[x0,x0,x1]
. Lưu ý rằng đó B
là 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, k
chiều thứ của B
sẽ 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⍉A
trong đó 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]
và A
như trên, thì chúng ta sẽ có đầu ra B
là 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
order
củ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ự đó.
⍉
sử dụng các chỉ số trục đảo ngược làm mặc định, do đó, ⍉A
giống như (2 1 0)⍉A
nếu A
là một mảng 3 chiều và nói chung ⍉A
là (⌽⍳≢⍴A)⍉A
.
[number-of-dimensions,first-dimension-length,second-dimension-length,…,last-dimension-length,first-element,second-element,…,last-element]
.
⍉
P