【问题标题】:How to shape array (sequence) to have arbitrary number of rows for a given number of columns如何将数组(序列)整形为具有给定列数的任意行数
【发布时间】:2018-12-14 10:24:03
【问题描述】:

简单的例子只是为了展示结构:

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

那个“190”需要计算为<b>⌈</b>⍴⍵÷10或者如果有一个符号说“将所有元素打包到一个R-wide数组中并让它根据需要有尽可能多的行”。 {(⍳⍵)}1900 只是一个任意代码的代表,它将生成数字的“流”,一旦它们被分割成行,左侧就会有更多的函数。

填充最后一行的问题是下一个问题,所以如果有人对此也有想法(不会爆炸代码的大小),请随时加入。或者先做那部分可能会更紧凑(如果有一个简单的方法来切片它,只要数字是所需原始宽度的精确倍数)?后面的行宽可能需要可变(输入、参数)。

【问题讨论】:

  • 如果您说明您使用的是哪个 APL,将会很有帮助。
  • 你的例子有不必要的大括号和括号:190 10 ⍴ ⍳1900

标签: arrays matrix reshape apl


【解决方案1】:

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

精确匹配

我的Dyalog APL Extended 存储库包含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。使用原型元素填充

为此,我们采用计算出的形状向量的乘积,并使用它从 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!

【讨论】:

  • 好的,你基本上是在说没有“魔法”(== 不写香肠)的方式来获得它。我有点希望,作为“一种 IBM 语言”APL 将具有可空性和可空性的概念(null==不知道,进程作为身份),并且会有“一些空”可以做你的¯1 正在做 - 并填充“空值”,OK 默认值更好(这是 SQL 后的概念,由 C# 提供 - 花了很长时间):-)。我实际上是在考虑“流处理” - 你根本不知道长度,只是它们必须被打包成“k-tuples”
  • 既然你提供了 :-) 我确实需要对第一个表达式进行一些演练: (¯1=⊢) 做什么以及在右侧交换“切割”的位置(我假设左切割是 ⍵▶ ⍴) ?我对 Dyalog 所做的非常钦佩,但他们的文档非常缺乏。我想我需要“用于 C++ 开发人员的 APL,具有用于 3 个世界“视图”的快捷方式和术语映射 :-) 包括普通和更高功能的 :-)。⍨ 的问题:无法直接看到它在哪里切表达式(我想必须编写绑定强度)并且没有“标记它”的语法(它可以在“更高功能”柯里化的中间切入)。
  • @ZXX 我已经添加了一个简短的解释。够了吗?顺便说一句,binding strengths are fully documented 只是一个普通的一元运算符,如 ¨
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 2015-11-03
  • 2023-04-09
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
相关资源
最近更新 更多