【问题标题】:kdb array map - how to apply a function to every element of an array?kdb 数组映射 - 如何将函数应用于数组的每个元素?
【发布时间】:2015-12-13 00:09:33
【问题描述】:

如何将函数应用于 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 对每个日期依次应用任意函数,漂亮吗?非常感谢!

【问题讨论】:

    标签: kdb


    【解决方案1】:

    每个都很有用,但建议尽可能避免使用它,因为它通常很慢。下面的斜线 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

    【讨论】:

    • 有趣。这听起来好像在那个时间点内隐藏着一个“在 kdb 中思考”的金块。为什么一个更快?感谢您对副词的推荐。这个(链接)似乎深入解决了副词。今晚我会读它,如果没有什么能取代它! firstderivatives.com/downloads/q_for_Gods_September_2013.pdf
    【解决方案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
    

    【讨论】:

    • 谢谢,这就是票!
    【解决方案3】:

    其他变体(不比副词好)

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

    如果您的函数是原子函数(将对列表的每个项目进行操作),则您不需要使用每个函数(以及其他循环变体)。许多内置的 Q 函数对于 ex 来说是原子的。上面函数中的'string'或'*'函数。

    在您的函数中,您使用的是逗号 ',' 运算符,它仅附加 2 个项目(在您的情况下为 2 个列表 string[x-1970.01.01] 和“.csv”),并且在此上下文中不是原子的。因此需要循环元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 2011-11-03
      • 2017-07-24
      • 2012-01-24
      相关资源
      最近更新 更多