kdb array map - 如何将函数应用于数组的每个元素?
kdb array map - how to apply a function to every element of an array?
如何将函数应用于 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
所以我想我会写另一个函数,它接受一个日期和 returns 该日期的 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 依次对每个日期应用任意函数,请问好吗?非常感谢!
参见 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
Each 很有用,但建议尽可能避免使用它,因为它通常很慢。 returns 下面的斜杠 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
其他变体(不比副词好)
q) f:{[x] string[((),x)-1970.01.01] cross enlist ".csv"} / () is used to cover case when x is atom
如果您的函数是原子函数(它将对列表的每一项进行操作),则无需使用 each(和其他循环变体)。许多内置的 Q 函数对于 ex 来说是原子的。 'string' 或上述函数中的 '*' 函数。
在您的函数中,您使用的是逗号“,”运算符,它仅附加 2 个项目(在您的案例中为 2 个列表字符串 [x-1970.01.01] 和“.csv”),在此上下文中不是原子的。因此需要循环元素。
如何将函数应用于 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
所以我想我会写另一个函数,它接受一个日期和 returns 该日期的 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 依次对每个日期应用任意函数,请问好吗?非常感谢!
参见 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
Each 很有用,但建议尽可能避免使用它,因为它通常很慢。 returns 下面的斜杠 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
其他变体(不比副词好)
q) f:{[x] string[((),x)-1970.01.01] cross enlist ".csv"} / () is used to cover case when x is atom
如果您的函数是原子函数(它将对列表的每一项进行操作),则无需使用 each(和其他循环变体)。许多内置的 Q 函数对于 ex 来说是原子的。 'string' 或上述函数中的 '*' 函数。
在您的函数中,您使用的是逗号“,”运算符,它仅附加 2 个项目(在您的案例中为 2 个列表字符串 [x-1970.01.01] 和“.csv”),在此上下文中不是原子的。因此需要循环元素。