PAYATHON 2026

如何在 DolphinDB 中合并两个等长数组,并按相同元素取对应值的最大值?

数据小许

分别拼接两组元素数组和数值数组,将它们构造成一张两列表。按元素执行 group by,对对应数值取 max,再按元素升序排序,就能得到两个对齐的输出数组,无需逐元素循环。

实现代码

DolphinDB 的 join(X, Y) 支持拼接两个向量,table 可以将等长向量构造成表的列。元素和数值向量采用相同的拼接顺序,以保留它们的对应关系。参见官方文档:join、table。

ap = 23 24 25 26
av = 10 20 30 40

ap2 = 24 25 26 27
av2 = 32 32 32 32

// 元素和数值按相同顺序拼接,保持逐行对应
 t = table(join(ap, ap2) as k, join(av, av2) as v)

// 相同元素归为一组,取对应数值的最大值,并按元素升序排序
r = select max(v) as max_v from t group by k order by k

// 从同一张结果表提取两个对齐的向量
result_ap = r.k
result_av = r.max_v

按示例数据,结果应为:

result_ap: 23 24 25 26 27
result_av: 10 32 32 40 32

为什么能得到这个结果?

拼接后,元素与数值仍然成对出现,例如 (24, 20) 和 (24, 32)。按 k 分组时,这两行进入同一组,max(v) 得到 32。

DolphinDB 的 group by 会将分组列包含在结果中,因此 select 中只需写聚合表达式;order by k 则按元素升序排列结果。对应语法见官方 group by 文档。

各组的计算结果如下:

元素对应数值最大值
231010
2420、3232
2530、3232
2640、3240
273232

原始位置用于确定元素与数值的配对关系,分组时则比较元素是否相同。例如,ap 中的 24 位于第二个位置,ap2 中的 24 位于第一个位置,两者对应的数值仍会放在同一组比较。

使用时需要注意什么?

  • 必须保证 ap 与 av 等长、ap2 与 av2 等长。两组之间不要求长度相同,因此该方法也适用于两组长度不同的情况。
  • 拼接前应确保两组元素类型兼容,两组数值类型也兼容。如果需要转换类型,应确认转换不会损失精度。
  • 不要先对元素数组单独去重或排序,再按原位置匹配数值,否则会破坏配对关系。
  • 如果同一个元素在单个输入数组内多次出现,这种写法会对所有对应数值取最大值。如果业务只允许保留某一次出现,需要另行定义规则。

该方法使用内置的向量拼接和分组聚合。实际延迟受数据规模、重复元素比例、数据类型和内存分配影响,拼接也会产生中间数据。应使用真实数据比较端到端耗时,不能仅凭取消循环就认定满足延迟要求。

备注:内容仅供参考。