kdb数组映射 - 如何将函数应用于数组的每个元素?

时间:2015-12-13 00:09:34

标签: kdb

如何将函数应用于kdb中数组的每个元素?例如,用各种语言对数字数组进行平方:

javascript: [1,2,3,4].map(square)          -> [1,4,9,16]
python:     [square(x) for x in [1,2,3,4]] -> [1,4,9,16]
kdb:        {[x] x*x} (1;2;3;4)            -> 1 4 9 16

所以我想我会写另一个带日期的函数并返回该日期的CSV文件名:

q)gobble:{[x] string[x-1970.01.01],".csv"}
q)gobble .z.d // .z.d == today
"16781.csv"

乌拉。所以现在我应该能够将该函数应用于一个日期数组并获得一个字符串数组作为回应,我想。愚蠢的凡人:

q)gobble .z.d + til 5 // .z.d + til 5 == array of 5 days starting today
"16781"
"16782"
"16783"
"16784"
"16785"
"."
"c"
"s"
"v"

显然在kdb中的平方是某种特殊情况,不能推广到所有函数。我如何告诉KDB依次对每个日期应用任意函数,好吗?非常感谢!

3 个答案:

答案 0 :(得分:4)

每个都很有用,但建议尽可能避免使用,因为它通常很慢。下面的斜杠t返回运行函数的时间,你可以看到gobble2更快。查看副词

q)gobble:{[x] string[x-1970.01.01],".csv"} q)\t gobble each .z.d + til 300200 221 q)gobble2:{[x] string[x-1970.01.01],\:".csv"} q)\t gobble2 .z.d + til 300200 76

答案 1 :(得分:2)

请参阅each

q)gobble each .z.d + til 5
   "16782.csv"
   "16783.csv"
   "16784.csv"
   "16785.csv"
   "16786.csv"

正方形操作起作用*可以对原子和列表进行操作

q)1 2 3 4 * 1 2 3 4
   1 4 9 16

答案 2 :(得分:0)

其他变体(每个右边都不比副词好)

  q) f:{[x] string[((),x)-1970.01.01] cross enlist ".csv"}  / () is used to cover case when x is atom

如果你的函数是原子的(它将对每个列表项运行)你不需要使用每个(和其他循环变体)。许多内置的Q函数都是原子的。 '串'或' *'功能在上面的功能。

在您的功能中,您使用的是逗号','运算符只附加2个项目(在您的案例字符串[x-1970.01.01]中有2个列表和" .csv")而在此上下文中不是原子的。因此需要循环元素。