二进位转置


9

与大多数APL符号一样,当用一个参数(移调)和两个参数(二进位转置/重排维)调用时,含义不同。这个挑战与后者有关,后者的行为类似于numpy.moveaxisPython或permuteMATLAB,但功能更强大。

order ⍉ A什么时候order有不同的条目

当的所有成员order都不同时,order ⍉ A等效于:

  • numpy.moveaxis(A, tuple(range(len(A.shape)), order) 在Python中,或
  • permute(A,order)在MATLAB中。引用后者的文档

B = permute(A,order)重新排列A的尺寸,以便它们按矢量顺序指定的顺序。所得数组B具有与A相同的值,但访问任何特定元素所需的下标顺序均按顺序指定进行重新排列。

例如,假设A是一个3D数组,然后让B ← (2 0 1)⍉A。那么B B[x0,x1,x2] = A[x2,x0,x1]对所有人来说x2,x0,x1

order ⍉ A什么时候order重复输入

order有重复的条目时,我们取数组的对角切片。例如,让A为2x3x4数组。B ← (0 0 1)⍉A沿着对角线切片A来制作B这样的图像B[x0,x1] = A[x0,x0,x1]。请注意,这B是一个2x4数组:如果它是3x4,则需要设置B[2, x1] = A[2, 2, x1]超出的范围A。一般情况下k的第N维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如上所述,那么我们将输出B为一维size-3数组,B = [0, 26, 52]这样B[1] = B[x0] = A[x0,x0,x0] = A[1,1,1] = 26

输入项

在这里,我们使用0索引,但是您也可以使用1索引,这是APL默认设置。

  • 多维或嵌套数组A的维数,Ñ ≥1。

  • n个正整数的列表order,该整数由任意值k < n的整数{0,1,...,k}(或1索引的{1,...,k + 1})组成,可能以任何顺序重复。

输出量

  • 多维或嵌套数组,表示对那些自变量应用二进转置的结果。(输出的尺寸为k + 1。

您可以根据meta上的当前标准编写完整的程序,函数等。

如果您的语言具有内置功能,建议您也编写一个没有内置功能的解决方案,以便获得有趣的答案。

测试用例

TIO测试用例

参考Python实现即将推出。

阅读测试用例的注意事项:在APL中,数组的倒数第二个和最终轴按此顺序沿列和行排列。


4
APL,1个字节::P
Quintec,

1
实际上,许多APL符号仅在使用一个参数调用时才使用默认的第二个参数。这包括其使用反相轴线指数为默认值,所以⍉A是相同的(2 1 0)⍉A,如果A是3维阵列并且通常⍉A(⌽⍳≢⍴A)⍉A
亚当

@lirtosiast有关I / O的问题:多维数组可以表示为一对形状(维列表)和内容(所有元素按其索引的字典顺序)吗?
ngn

@ngn我暂时拒绝,但是您应该在meta上询问默认情况下该格式是否可接受。
lirtosiast

@lirtosiast有趣的是,Dyalog APL在内部将数组存储为[number-of-dimensions,first-dimension-length,second-dimension-length,…,last-dimension-length,first-element,second-element,…,last-element]
亚当

Answers:


4

APL(Dyalog Unicode),34 字节SBCS

这是我的同事的代码(从稍微修改罗杰·惠APL的历史在50个函数第30章),贴有明确许可。

匿名默认隐式lambda(可用作的插入项)。

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

在线尝试!

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.