以下numpy代码的KDB等效项是什么

时间:2019-01-20 06:07:33

标签: kdb

我正在尝试获取更多的Q,所以我对Q中实现以下目标的最佳方法感到好奇。

  

在[18]中:a = np.arange(12).reshape(3,4)

     

在[19]中:b = np.random.randint(10,size =(3,4))

     

In [20]:a Out [20]:array([[0,1,2,3],          [4,5,6,7],          [8、9、10、11]])

     

In [21]:b Out [21]:array([[3,6,9,5],          [4,2,1,3],          [6,9,3,5]])

     

在[22]中:a [a> 5] = b [a> 5]

     

In [23]:a Out [23]:array([[0,1,2,3],          [4、5、1、3],          [6,9,3,5]])

还有什么好方法,

a[np.where(cond)] = b[np.where(cond)]

谢谢!

2 个答案:

答案 0 :(得分:2)

下面介绍了命令的等效KDB操作。

注意::请注意,这些KDB和numpy函数并不完全相同 当量。它们仅在某些输入条件下表现相似。详细阅读KDB函数的行为特别是因为 他们超负荷。 我在底部提供了此处使用的kdb运算符的链接。

1。 a = np.arange(12).reshape(3,4)

在KDB中单输入的numpy'arange'等效为'til'运算符。而KDB中的重整运算符是'#'。

与之等效的KDB命令为:

 q) a:2 4 #til 12

2。 b = np.random.randint(10,size =(3,4))

'?' KDB中的运算符给出随机值。它不支持尺寸,但是可以使用形状运算符轻松实现。

q) 2? 4  / output 1 3 (2 random values)
q) 3 4# 12?10

或者我们可以为此创建一个通用函数:

q) {(y;z )#?[y*z;x]} [8 ;3 ;4]

3。 a [np.where(cond)] = b [np.where(cond)]

在KDB中有不同的方法可以做到这一点。这取决于您使用的解决方案的列表大小。有些会表现更好 在小名单上,有些将在大名单上表现更好。因此,请根据您的项目进行测试。

下面提到的所有三种解决方案将为您提供所需的输出。

q) a: 3 4#til 12;
q) b: (3 6 9 5;4 2 1 3;6 9 3 5)

q) a:(a*not i)+b*i:a>5  /solution 1

同时使用@和两者

q) a:{@[x;y;:;z]}'[a;i;b@'i: where each a > 5] / solution 2
q) a:@'[a;i;:;b@'i: where each a > 5]  /short form

或使用dot(。)运算符在适当的位置更改原始数组:

 q) l:(til count a),'enlist each where@'a>5 
 q) {.[`a;x;:;y]}'[l;b ./:l]  /solution 3
 q) .'[`a;l;:;b ./:l]  short form

在此处阅读更多详细信息:

https://code.kx.com/q/ref/card/

https://code.kx.com/q/ref/arith-integer/#til

https://code.kx.com/q/ref/unclassified/#apply

https://code.kx.com/q/ref/select/#index-at

https://code.kx.com/q/ref/random/#roll

答案 1 :(得分:0)

a:3 4#til 12 //根据上述逻辑初始化矩阵

b:3 4#12?10 //按照上述逻辑初始化b矩阵

@'[a; ; :; b @'t:其中每个a> 5] //根据上述逻辑