如何将数组(序列)整形为对于给定数量的列具有任意数量的行

How to shape array (sequence) to have arbitrary number of rows for a given number of columns

用于显示结构的简单示例:

{19010⍴⍵}{(⍳⍵)}1900

即“190”需要计算为⍴⍵÷10或如果有一个符号说 "pack all elements into an R-wide array and let it have as many rows as needed"。 {(⍳⍵)}1900 只是一个任意代码的代表,它将生成 "the stream" 个数字,一旦它们被切成行,左侧就会有更多的功能。

接下来是填充最后一行的问题,所以如果有人对此有想法(不会增加代码的大小),请随意插话。或者做这部分可​​能会更紧凑首先(如果有一种简单的方法来切片它,前提是数字是所需原始宽度的精确倍数)?后面的行宽可能需要可变(输入,参数)。

如果以下任何代码不清楚,请告诉我,我将详细说明它是如何工作的。

完全合适

My Dyalog APL Extended repository contains a cover function for 正是这样做的,但推广到所有级别的数组。它允许您使用 ¯1 来指示应自动计算特定尺寸的长度以精确适合数据。代码如下:

⍵⍴⍨(|(×/⍴⍵)÷×/⍺)@(¯1=⊢)⍺ 其中是形状向量,是数据。 Try it!
(|(×/⍴⍵)÷×/⍺)计算标有¯1
的长度 @(¯1=⊢) 在掩码 (¯1=⊢)⍺ 指示的位置用此值修改 (参见 trains
⍵⍴⍨ 使用该形状重塑 (而不是将其重塑为形状

如果您只需要一个矩阵,以下将在您可能使用的任何 APL 中完成工作:

(((×/⍴⍵)÷⍺),⍺)⍴⍵ 其中是行数,是数据。 Try it!

填充

如果您知道要填充最后一行(而不是错误或省略不完整的尾随行),您基本上有三个选项:

  1. 从数据开头回收元素

  2. 用原型元素填充

  3. 使用自定义填充元素填充

1。从数据开头回收元素

这个很简单,因为那是 默认情况下所做的,所以您只需要向上取整 () 行数:

通用Dyalog解决方案:⍵⍴⍨(<strong>⌈</strong>|(×/⍴⍵)÷×/⍺)@(¯1=⊢)⍺ Try it!

仅适用于所有 APL 的矩阵:((<strong>⌈</strong>(×/⍴⍵)÷⍺),⍺)⍴⍵ Try it!

2。用原型元素填充

为此,我们采用计算出的形状向量的乘积,并使用它来 "over" 在我们使用形状之前从整理好的 (,) 数据中获取 () 个元素实际重塑的矢量:

通用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!