问题描述
在kdb + / q中实现numpy random choice的规范方法是什么? 具体来说,如何复制以下选择
np.random.choice(5,3,p=[0.1,0.3,0.6,0])
从而提供了概率分布。滚动,交易和置换似乎没有考虑概率分布?
谢谢。
解决方法
我认为这样做的一种怪诞方式:
q){[n;k;p]k?raze p#'til n}[5;3;1 0 3 6 0]
3 2 3
在这里,您没有给出概率列表,而是给出了代表比例的整数列表(但仍将代表概率)。
我想虽然还有一种 canonical 方式。
我认为如果您需要概率的话,这是可行的:
q){[n;k;p]k?raze ("j"$p*10 xexp max count each("."vs'string p)[;1])#'til n}[5;3;0.05 0 0.3 0.65 0]
2 3 3
再次,非常hacky。
编辑:正如user20349在评论中所说,您可以使用where
的重载来执行上述操作,并减少一个参数:
q){[k;p]k?where p}[3;1 0 3 6 0]
3 0 3
q){[k;p]k?where("j"$p*10 xexp max count each("."vs'string p)[;1])}[3;0.05 0 0.3 0.65 0]
3 3 3