如果以下任何代码不清楚,请告诉我,因为我会详细说明它是如何工作的。
精确匹配
我的Dyalog APL Extended 存储库包含a cover function for ⍴,它正是这样做的,但推广到所有等级的数组。它允许您使用¯1 指示应自动计算特定维度的长度以完全适合数据。代码如下:
⍵⍴⍨(|(×/⍴⍵)÷×/⍺)@(¯1=⊢)⍺ 其中⍺是形状向量,⍵是数据。 Try it!
(|(×/⍴⍵)÷×/⍺) 计算用¯1 标记的长度的长度
@(¯1=⊢) 在掩码 (¯1=⊢)⍺ 指示的位置用此值修正 ⍺(请参阅 trains)
⍵⍴⍨ 使用该形状重塑 ⍵(而不是将其重塑为 ⍵ 形状)
如果您只需要一个矩阵,以下内容将在您可能使用的任何 APL 中完成这项工作:
(((×/⍴⍵)÷⍺),⍺)⍴⍵ 其中⍺ 是行数,⍵ 是数据。 Try it!
填充
如果您知道要填充最后一行(而不是错误或省略不完整的尾行),您基本上有三个选择:
从数据的开头回收元素
使用原型元素填充
带有自定义填充元素的填充
1。从数据的开头回收元素
这很简单,因为这是 ⍴ 默认做的,所以你只需要四舍五入 (⌈) 行数:
一般 Dyalog 解决方案:⍵⍴⍨(<strong>⌈</strong>|(×/⍴⍵)÷×/⍺)@(¯1=⊢)⍺ Try it!
矩阵仅适用于所有 APL:((<strong>⌈</strong>(×/⍴⍵)÷⍺),⍺)⍴⍵ Try it!
2。使用原型元素填充
为此,我们采用计算出的形状向量的乘积,并使用它从 raveled (,) 数据中“过度”获取 (↑) 元素,然后再使用形状向量进行实际重塑:
一般 Dyalog 解决方案:((⌈|(×/⍴⍵)÷×/⍺)@(¯1=⊢)⍺)<strong>{⍺⍴(×/⍺)↑,⍵}</strong>⍵ Try it!
Marix 仅适用于所有 APL:((⌈(×/⍴⍵)÷⍺),⍺)<strong>{⍺⍴(×/⍺)↑,⍵}</strong>⍵ Try it!
3。使用自定义填充元素填充
我们可以通过从所需数量中减去给定数据元素的数量来找到需要多少填充元素(我将使用¯3)。然后我们在重塑之前将 (,) 那么多填充元素连接到散列的 (,) 数据:
通用 Dyalog 解决方案:((⌈|(×/⍴⍵)÷×/⍺)@(¯1=⊢)⍺)<strong>{⍺⍴(,⍵),((×/⍺)-(×/⍴⍵))⍴¯3}</strong>⍵ Try it!
矩阵仅适用于所有 APL:((⌈(×/⍴⍵)÷⍺),⍺)<strong>{⍺⍴(,⍵),((×/⍺)-(×/⍴⍵))⍴¯3}</strong>⍵ Try it!