flatten

语法

flatten(X, [depthFirst=true])

详情

将矩阵、字典、元组或一系列向量展开。

对于字典,函数会舍弃键(key),仅将值(value)展开为一维向量。字典的 value 必须是标量、向量或矩阵。否则,函数将抛出异常。

对于元组:

  • 元组只有一个元素,则返回该元素。

  • 元组的元素包含字典:如果所有元素都是字典,且多个字典的键值类型一致,多个字典 flatten 之后返回一个字典。否则,函数将抛出异常。

  • 元组的元素包含表:如果所有元素都是表,且表的字段名称和类型完全相同,则将多个表合成一个表。否则,每个表将被当作是多个字典(行)的元组来处理。

对于嵌套元组,flatten 使用不同的展开算法,具体取决于 depthFirst参数:

  • depthFirst=true 时,flatten 优先展开内层嵌套的元素。

    • 如果嵌套元素存在元组,则对这些元组的最内层元素进行展开,其他元素保持不变,返回结果仍为元组。

    • 如果嵌套元素不是元组,则直接返回一个一维向量。

  • depthFirst=false 时,flatten 对最外层的元素进行展开,内层嵌套的元素保持不变。

可通过 reduce 递归调用 flatten 函数,将嵌套的元组展开为一维向量。

参数

X可以是向量、矩阵、字典或元组。

depthFirst 可选参数,布尔值,默认值为 true,表示采用深度优先的算法。若设置为 false,则采用宽度算法。该参数仅在 X 是元组时生效。

返回值

  • X 为向量、矩阵、字典,返回一个向量。

  • X 为同构字典组成的元组,返回一个字典。

  • X 为同构表组成的元组,返回一个表。

  • 元组未完全展开时,返回一个元组。

例子

将一个矩阵转换成向量。

m=1..10$5:2;
flatten(m);
// output
[1,2,3,4,5,6,7,8,9,10]

将一系列向量转换成一个向量。

a=1..10;
b = a cut 2;
b;
// output
([1,2],[3,4],[5,6],[7,8],[9,10])
flatten(b);
// output
[1,2,3,4,5,6,7,8,9,10]

x=flatten([1, [2,3]]);
x;
// output
[1,2,3]

关于将一个向量分成多个小的向量,参见 cut 函数。

将一个嵌套元组转换成一个向量。

list = (1, (2, (3, 4, 5)), (6, 7), 8, [9])
x1 = flatten(list)
x1
//此时先将元组元素(3, 4, 5)、(6, 7)转换为一维向量[3,4,5]、[6,7],返回结果仍然为元组
// output:(1,(2,[3,4,5]),[6,7],8,[9])
x2= flatten(x1)
x2
//再次执行,将元组元素(2,[3,4,5])转换为一维向量[2,3,4,5],返回结果仍然为元组
// output:(1,[2,3,4,5],[6,7],8,[9])
x3= flatten(x2)
x3
//最后,将元组转换为一维向量
// output:[1,2,3,4,5,6,7,8,9]

也可使用 reduce 函数循环执行转换,返回最终结果。

reduce(flatten, init=list)
// output:[1,2,3,4,5,6,7,8,9]

若想观察逐步转换的结果,可使用 accumulate

accumulate(flatten, init=list)
// output:[(1,(2,(3,4,5)),(6,7),8,[9]),(1,(2,[3,4,5]),[6,7],8,[9]),(1,[2,3,4,5],[6,7],8,[9]),[1,2,3,4,5,6,7,8,9]]

将一个包含矩阵的元组转换成一个向量。

m = 1..10$5:2;
n = ( m ,11, (12, 13), [14])
reduce(flatten, init=n)
// output:[1,2,3,4,5,6,7,8,9,11,12,13,14]

将一个字典转换成一个向量。

d = {"a":1, "b":2}
res = flatten(d)
// output: [1,2]

将一个同构字典组成的元组 flatten 之后返回一个字典。

a = [dict(1 2 3,10 20 30),dict(1 2 3,`aaa`bbb`ccc)]
res = flatten(a)
typestr(res)
// output: INT->ANY DICTIONARY

将一个同构表组成的元组 flatten 之后返回一个表。

res = flatten([table(1..3 as sym, 11..13 as price), table(21..23 as sym, 31..33 as price)])
sym price
1 11
2 12
3 13
21 31
22 32
23 3

若组成元组的表的字段名称和类型不完全相同,返回一个元组。

a = [table(1..3 as sym, 11..13 as price), table(21..23 as a, 31..33 as b)]
res = flatten(a)
typestr(res)
// output: ANY VECTOR

若元组包括表和其他类型,返回一个元组。

a=[table(1..6 as sym, 11..16 as price), 1..4$2:2]
res = flatten(a)
typestr(res)
// output: ANY VECTOR