如何对数组(序列)进行整形以使给定列数具有任意行数

时间:2018-12-14 10:24:03

标签: arrays matrix reshape apl

仅举个例子说明结构:

{190 10 ⍴⍵}{(⍳⍵)}1900

190 ”的计算方式应为⍴⍵÷10,或者如果有一个符号表示“将所有元素打包为 R 宽的数组,让它具有所需的任意多行”。 {(⍳⍵)}1900只是任意代码的代名词,它将生成数字的“流”,一旦将它们切成行,左侧的函数就会更多。

接下来是填充最后一行的问题,因此,如果有人也对此有一个想法(不扩大代码的大小),可以随意输入。或者,可能更紧凑的做法是先执行该部分(如果有一个简单的切片方法,只要该数字是所需原始宽度的精确倍数)?行宽稍后可能需要可变(输入,参数)。

1 个答案:

答案 0 :(得分:1)

请让我知道以下代码是否不清楚,因为我将详细说明其工作原理。

完全合适

我的Dyalog APL Extended存储库包含a cover function for ,它可以做到这一点,但是可以推广到所有等级的数组。它允许您使用¯1来指示应该自动计算特定尺寸的长度以完全适合数据。代码如下:

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

如果仅需要矩阵,则可以在您可能使用的任何APL中执行以下操作:

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

填充

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

  1. 从数据开头回收元素

  2. 带有原型元素的画笔

  3. 带有自定义填充元素的填充

1。从数据开头回收元素

这很容易,因为默认情况下就是这样做的,因此您只需要舍入()行数:

常规Dyalog解决方案:⍵⍴⍨(|(×/⍴⍵)÷×/⍺)@(¯1=⊢)⍺ Try it!

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

2。带有原型元素的垫

为此,我们采用计算出的形状矢量的乘积,然后在使用形状矢量进行实际整形之前,将其用于“覆盖”已散布的数据中的(,个元素:

常规Dyalog解决方案:((⌈|(×/⍴⍵)÷×/⍺)@(¯1=⊢)⍺){⍺⍴(×/⍺)↑,⍵} Try it!

Marix仅适用于所有APL:((⌈(×/⍴⍵)÷⍺),⍺){⍺⍴(×/⍺)↑,⍵} Try it!

3。填充自定义填充元素

通过从所需数量中减去给定数据元素的数量,可以找到需要多少个填充元素(我将使用¯3)。然后,我们将(,)的许多填充元素连接到杂乱无章(,)的数据之前,然后进行重塑:

常规Dyalog解决方案:((⌈|(×/⍴⍵)÷×/⍺)@(¯1=⊢)⍺){⍺⍴(,⍵),((×/⍺)-(×/⍴⍵))⍴¯3} Try it!

仅适用于所有APL的矩阵:((⌈(×/⍴⍵)÷⍺),⍺){⍺⍴(,⍵),((×/⍺)-(×/⍴⍵))⍴¯3} Try it!