如何在KDB中替换列表中的元素?
解决APL中列表元素替换的问题
嘿,我来帮你搞清楚这个问题!首先咱们先拆解下你原来的方法为什么无效:
你写的d . {x=0w}是用错了APL的运算符——这里的.(点运算符)主要用来做矩阵乘法或者函数复合,根本不是用来对数组每个元素逐一应用判断逻辑的,所以自然得不到你想要的布尔值列表。
正确定位0w的方式
要生成标记0w位置的布尔列表,有两种靠谱的方法:
- 直接用元素级比较:
d = 0w。APL里的=支持标量-数组广播,当右边是标量0w时,会和左边数组的每个元素逐一对比,返回像1 0 0 0这样的布尔数组(假设你的d是0w 1 2 3)。 - 用each运算符(
¨)对每个元素应用判断函数:{x=0w}¨d。这个方法适合逻辑更复杂的判断场景,同样能得到目标布尔列表。
替换0w的几种实用方案
有了定位0w的布尔列表,替换就很简单了,给你几个常用方法:
布尔索引直接赋值(最直观)
把布尔列表作为索引,直接给对应位置赋值:d[d = 0w] ← '∞' // 替换成易读的字符串形式 // 也可以替换成数字,比如0 d[d = 0w] ← 0执行后
d就会变成'∞' 1 2 3或者0 1 2 3。使用
@替换运算符@运算符能精准定位替换位置,语法更灵活:d @ (d = 0w) ← '∞'这里
(d=0w)指定了要替换的位置,后面跟着你想要的替代值。方言专属替换语法(可选)
如果你用的是像Dyalog APL这类支持扩展语法的方言,还可以用更简洁的替换写法:d ← 0w '∞' ⍠ d // 把d中的0w替换为'∞'
内容的提问来源于stack exchange,提问作者cjm2671
相关产品推荐
相关产品推荐

